unit FSUBFAMILIA;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, ExtCtrls, StdCtrls,tiposdefinidos,DBCLIENT,STRUTILS,DB,MATH;

type
  TSUBFAMILIA = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure HACERClick(Sender: TObject);
  private
    { Private declarations }
    ELEMENTO:INTEGER;
    procedure cargararticulo(articulo:string);
  public
    { Public declarations }
    ANCHO,NUMEROXFILA,FILAS:INTEGER;
    NBOTON,NFILA,PROFUNDIDAD:INTEGER;
    COD_FAMILIA:STRING;
    TOTALBOTONES:INTEGER;


    TBOTONES:INTEGER;// TOTAL BOTONES EN LA FAMILIA.
    DBOTON:INTEGER;// BOTONES DIBUJADOS.
    PADRE,APADRE:STRING;// CODIGO DEL PADRE
    PADREPROFUNDIDAD,APADREPROFUNDIDAD:INTEGER;// PROFUNDIDAD DEL PADRE.
    FUNCTION CREARARTICULO(COD,PROF:STRING):BOOLEAN;

    FUNCTION ENCONTRARFORM(NOMBRE:STRING):BOOLEAN;
    PROCEDURE DIBUJARBOTON(DESCRIPCION,COD_FAMILIA,PROFUNDIDAD:STRING;FB:SMALLINT;BIMAGEN,BDESCRIPCION:BOOLEAN);
    // FB -> 0 FAMILIA
    // FB -> 1 ARTICULO
    // FB -> 2 SALIDA
    FUNCTION CAMBIAR(AUX:STRING):STRING;
  end;

var
  SUBFAMILIA: TSUBFAMILIA;
CONST
   AAFILTRO = '__Ww__'; // '-'
   ABFILTRO = '_Ww_'; //  '/'
Implementation

uses UDMGS, FFAMILIA, FTICKET,fmuestra;

{$R *.dfm}

procedure TSUBFAMILIA.FormCreate(Sender: TObject);
VAR j:variant;
    i:integer;
    B:VARIANT;
begin
  IMAGE1.Picture.SaveToFile('SALIDA.BMP');
  B :=INT(592 * SCREEN.Width / 800 );
  SELF.Width := B ;
  ANCHO := SELF.Width ;
  B:= (ANCHO - 8) / (screen.Width /10);
  NUMEROXFILA:= B; // numero por fila
  NBOTON:=1;NFILA:=1;
  TBOTONES:=0;// TOTAL BOTONES EN LA FAMILIA.
  TOTALBOTONES := 0;
  // HABRIA QUE SUMAR 1 A TBOTONES EN  EL FORMULARIO DE FAMILIAS
  DBOTON:=0;// BOTONES DIBUJADOS.
End;

procedure TSUBFAMILIA.HACERClick(Sender: TObject);
VAR AUX:STRING;
    I:INTEGER;
    ESTA:BOOLEAN;
    LETRA:CHAR;
    FRM:TSUBFAMILIA;
begin
   ESTA:=FALSE;
   IF (SENDER IS TSPEEDBUTTON) THEN
   BEGIN
    AUX := (SENDER AS TSPEEDBUTTON).Name;
    LETRA := AUX[1];
    IF LETRA = 'B' THEN // ABRIR LA FAMILIA
    BEGIN
     AUX := 'F' + RIGHTSTR(AUX,LENGTH(AUX)-1); // LE QUITO LA B BUTTON  Y LE PONGO UNA F FORM
     I := 0;
     WHILE (I < SCREEN.FormCount) AND NOT ESTA  DO
     BEGIN
       IF (SCREEN.Forms[I].Name = AUX) THEN
       BEGIN
          FRM := SELF;
          SCREEN.FORMS[I].Show;
          SCREEN.FORMS[I].BringToFront;
          ESTA := TRUE;
          FRM.Hide;
       END;
       I:= I+1;
     END;
    END
    ELSE
    IF LETRA = 'A'  THEN
       BEGIN
           AUX := RIGHTSTR(AUX,LENGTH(AUX)-1);// quito la 'A'
           AUX :=STRINGREPLACE(aux,AAFILTRO,'-',[rfReplaceAll, rfIgnoreCase]);
           AUX :=STRINGREPLACE(aux,ABFILTRO,'/',[rfReplaceAll, rfIgnoreCase]);
//           CargarArticulo(aux);
           CargarArticulo((SENDER AS TSPEEDBUTTON).HINT);
       END
       ELSE
       IF LETRA = 'S' THEN
       BEGIN
          AUX := 'F'+APADRE+INTTOSTR(APADREPROFUNDIDAD); // LE QUITO LA B BUTTON  Y LE PONGO UNA F FORM
          I := 0;
          WHILE (I < SCREEN.FormCount) AND NOT ESTA  DO
          BEGIN
                IF (SCREEN.Forms[I].Name = AUX) THEN
                BEGIN
                 FRM := SELF;
                 IF (PADREPROFUNDIDAD=0)
                 AND (SELF.NAME = AUX)
                 // PARA QUE MUESTRE LA FAMILIA
                 THEN
                 BEGIN
                    FAMILIA.ShoW;
//                    FAMILIA.Visible := TRUE;
                    FAMILIA.BringToFront;
                 END
                 ELSE
                 BEGIN
                    SCREEN.FORMS[I].Show;
//                    SCREEN.Forms[I].Visible := TRUE;
                    SCREEN.FORMS[I].BRINGTOFRONT;
                 END;
                 ESTA := TRUE;
                 FRM.Hide;
                END;
          I:= I+1;
          END;
       END;
   END;
end;

FUNCTION TSUBFAMILIA.CREARARTICULO(COD,PROF:STRING):BOOLEAN;
VAR b,j:variant;
    C,a,h,i,LONGPANEL2:integer;
    AUXCAR,NAME,ORDEN,APOSICION,APOSICIONUSO,ADESCRIPCION:STRING;
    AUX:TSPEEDBUTTON;
begin
// Y SI HAY SUBFAMILIAS
  WITH DMGS.CDSQ_FLOAT DO
  BEGIN
      CLOSE;
      COMMANDTEXT := ' SELECT AORDENPOSICION,AORDENPOSICIONUSO,AORDENDESCRIPCION FROM FAMILIAS WHERE COD_FAMILIA='''+COD+''' AND PROFUNDIDAD='+PROF+' ';
      OPEN;
      APOSICION := FIELDS[0].AsString;
      APOSICIONUSO := FIELDS[1].AsString;
      ADESCRIPCION := FIELDS[2].AsString;
      CLOSE;
  END;

  RESULT := FALSE;
  I:= 1;
  with DMGS.CDSQ_ARTICULOSAUX do
  BEGIN
     Close;
//     DMGS.VARTICULOSAUX.ID :=' WHERE PROFUNDIDAD ';
     DMGS.VARTICULOSAUX.ID := ' WHERE COD_FAMILIA='''+COD+''' AND PROFUNDIDAD= '+PROF;
     DMGS.VARTICULOSAUX.TIPO  :='4';
     DMGS.VARTICULOSAUX.BORRADO := '0';
          ORDEN := '';
     if trim(APOSICION) = '1' then
        ORDEN := ' POSICION,DESCRIPCIONBOTON '
     ELSE IF TRIM(APOSICIONUSO) = '1' THEN
        ORDEN := ' POSICIONUSO,DESCRIPCIONBOTON '
          ELSE IF TRIM(ADESCRIPCION) = '1' THEN
             ORDEN := ' DESCRIPCIONBOTON ';
     IF ORDEN = '' THEN
        ORDEN := ' ID_ARTICULO,PROFUNDIDAD,COD_FAMILIA,DESCRIPCIONBOTON ';
     ORDEN := ' ORDER BY ' + ORDEN;
     dmgs.vARTICULOSaux.ORDEN := ORDEN ;
     Open;
  END;
  while not dmgs.cdsq_ARTICULOSaux.Eof do
  begin
    dmgs.cdsq_ARTICULOSaux.Last;
    IF DMGS.cdsq_ARTICULOSaux.Eof THEN
    try // para evitar el error de memoria bloqueada en el server.
       DMGS.cdsq_ARTICULOSaux.GetNextPacket ;
    except
    end;
  end;
  DMGS.CDSQ_ARTICULOSAUX.First;
  IF DMGS.CDSQ_ARTICULOSAUX.RecordCount > 0 THEN
  BEGIN
       while not dmgs.cdsq_ARTICULOSaux.Eof do
       BEGIN
         dmgs.CDSQ_ARTICULOSauximagen.savetoFile(DMGS.fichero);
         DIBUJARBOTON(DMGS.CDSQ_ARTICULOSAUXDESCRIPCIONBOTON.ASSTRING,
                 DMGS.CDSQ_ARTICULOSAUXCOD_FAMILIA.ASSTRING,
                 DMGS.CDSQ_ARTICULOSAUXPROFUNDIDAD.ASSTRING,1,
                  DMGS.CDSQ_ARTICULOSAUXMOSTRARIMAGEN.Asstring='1',
                  DMGS.CDSQ_ARTICULOSAUXMOSTRARDESCRIPCION.Asstring='1');
                 
         DMGS.CDSQ_ARTICULOSAUX.NEXT;
       END;
    END;
  DMGS.CDSQ_ARTICULOSAUX.CLOSE;
end;
PROCEDURE TSUBFAMILIA.DIBUJARBOTON(DESCRIPCION,COD_FAMILIA,PROFUNDIDAD:STRING;FB:SMALLINT;BIMAGEN,BDESCRIPCION:BOOLEAN);
//FB -> TRUE ES FAMILIA FB -> FALSE ES ARTICULO
VAR AUX:TSPEEDBUTTON;
    B:VARIANT;
    C,I:INTEGER;
    AUXCAR,NAME,NOMBRE,TEXTO,TEXTO2:STRING;
    ERROR:BOOLEAN;
BEGIN
   AUX := TSPEEDBUTTON.Create(SELF);//familia
   aux.Parent := SELF;//familia
   B:= INT(SCREEN.Width/10);
   AUXCAR :='';
   IF (DESCRIPCION <> '') THEN
       AUXCAR :=TRIM(DESCRIPCION);
   B:=INT(B/AUX.Font.Size);
   C:=B;

   TEXTO := '';
   AUXCAR := TRIM(AUXCAR);
   TEXTO := TRIM(COPY(AUXCAR,1,POS(' ',AUXCAR)-1));
   // PONGO EL TEXTO EN DOS LINEAS SI LA PRIMERA LINEA ES MAYOR
   // QUE EL BOTON LA RECORTO.
   IF LENGTH(TEXTO) > C THEN // PARA QUE CORTE LA DESCRIPCION Y QUEPA EN EL BOTON
        TEXTO := COPY(TEXTO,1,C);
   IF TEXTO <> '' THEN
   BEGIN
       TEXTO2 := COPY(AUXCAR,POS(' ',AUXCAR),LENGTH(AUXCAR)-1);
   // PONGO EL TEXTO EN DOS LINEAS SI LA SEGIUNDA LINEA ES MAYOR
   // QUE EL BOTON LA RECORTO.
         IF LENGTH(TEXTO2) > C THEN // PARA QUE CORTE LA DESCRIPCION Y QUEPA EN EL BOTON
            TEXTO2 := TRIM(COPY(TEXTO2,1,C));
       AUXCAR := TEXTO + #13+ TEXTO2;
   END
   ELSE
   IF LENGTH(AUXCAR) > C THEN // PARA QUE CORTE LA DESCRIPCION Y QUEPA EN EL BOTON
      AUXCAR := COPY(AUXCAR,1,C);

//   IF LENGTH(AUXCAR) > C THEN // PARA QUE CORTE LA DESCRIPCION Y QUEPA EN EL BOTON
//      AUXCAR := COPY(AUXCAR,1,C);
   IF BDESCRIPCION THEN
      AUX.CAPTION := AUXCAR;
   IF BIMAGEN THEN
      AUX.Glyph.LoadFromfile(DMGS.fichero);
   IF FB=2 THEN
      AUX.Glyph.LoadFromFile('SALIDA.BMP');
   aux.NumGlyphs := 1;
   aux.Layout := blglyphtop;
   AUX.ENABLED := TRUE;
   AUX.FLAT := TRUE;
   IF FB=0 THEN
     AUX.Font.Color := $00804000
   ELSE IF FB=1 THEN
           AUX.Font.Color := $004080FF;

   AUX.Font.Size := 8;
   B:=SCREEN.Width/10; // EL FORMATO DE PANTALLA QUE TENGA LA DECIMA PARTE
   AUX.Height := B ;
   AUX.WIDTH := B ;
   B := NBOTON;
   aux.Left := 8 + (B-1)*screen.Width /10;
   B:= (NFILA-1)* SCREEN.Width/10;
   aux.top := 8 + B;
   AUX.TAG := STRTOINT(PROFUNDIDAD); // PARA DESPUES IDENTIFICAR AL ARTICULO
   IF FB=0 THEN
    TRY
      AUX.NAME := 'B'+CAMBIAR(COD_FAMILIA)+PROFUNDIDAD
    EXCEPT
      ERROR := TRUE;I:=0;
      WHILE ERROR DO
        TRY
          AUX.NAME:='B'+CAMBIAR(COD_FAMILIA)+PROFUNDIDAD+INTTOSTR(I);
          ERROR := FALSE;
        EXCEPT
          I:=I+1;
        END;
    END
   ELSE IF FB=1 THEN
        BEGIN
//           NAME :=STRINGREPLACE(DMGS.CDSQ_ARTICULOSAUXID_ARTICULO.AsString,'-',AAFILTRO,[rfReplaceAll, rfIgnoreCase]);
//           Name :=STRINGREPLACE(NAME,'/',ABFILTRO,[rfReplaceAll, rfIgnoreCase]);
//           AUX.Name := 'A' + CAMBIAR(DMGS.CDSQ_ARTICULOSAUXID_ARTICULO.ASSTRING);
    TRY
      AUX.HINT := DMGS.CDSQ_ARTICULOSAUXID_ARTICULO.ASSTRING;
      AUX.ShowHint := TRUE;
      AUX.NAME := 'A'+CAMBIAR(DMGS.CDSQ_ARTICULOSAUXID_ARTICULO.ASSTRING);
    EXCEPT
      ERROR := TRUE;I:=0;
      WHILE ERROR DO
        TRY
          AUX.NAME:='B'+CAMBIAR(DMGS.CDSQ_ARTICULOSAUXID_ARTICULO.ASSTRING)+INTTOSTR(I);
          ERROR := FALSE;
        EXCEPT
          I:=I+1;
        END;
    END;
        END
        ELSE IF FB=2 THEN
//           AUX.NAME := 'S'+CAMBIAR(COD_FAMILIA)+PROFUNDIDAD;
    TRY
      AUX.NAME := 'S'+CAMBIAR(COD_FAMILIA)+PROFUNDIDAD;
    EXCEPT
      ERROR := TRUE;I:=0;
      WHILE ERROR DO
        TRY
          AUX.NAME:='S'+CAMBIAR(COD_FAMILIA)+PROFUNDIDAD+INTTOSTR(I);
          ERROR := FALSE;
        EXCEPT
          I:=I+1;
        END;
    END;
   AUX.Transparent := TRUE;
   AUX.OnClick := HACERCLICK;
   IF NBOTON = NUMEROXFILA THEN
   BEGIN
     NBOTON := 1;
     NFILA := NFILA +1;
   END
   ELSE
     NBOTON := NBOTON + 1;
   // NO TENGO EN CUENTA EL BOTON DE SALIDA
   IF FB<>2 THEN
      DBOTON := DBOTON + 1;

END;
FUNCTION TSUBFAMILIA.ENCONTRARFORM(NOMBRE:STRING):BOOLEAN;
VAR I:INTEGER;
    AUX:BOOLEAN;
BEGIN
  I := 0;
  AUX := FALSE;
  RESULT := FALSE;
  WHILE (I < SCREEN.FormCount ) AND
       NOT AUX
  DO
  BEGIN
    IF SCREEN.Forms [I].Name =  NOMBRE THEN
    BEGIN
        SUBFAMILIA := (SCREEN.FORMS [I] AS TSUBFAMILIA);
       AUX := TRUE;
       RESULT := TRUE;
    END;
    I:=I+1;
  END;
END;
procedure TSUBFAMILIA.cargararticulo(articulo:string);
VAR I:INTEGER;
    AUX:BOOLEAN;
BEGIN
  I := 0;
  AUX := FALSE;
  WHILE (I < SCREEN.FormCount ) AND
       NOT AUX
  DO
  BEGIN
    IF SCREEN.Forms [I].Name =  'TICKET' THEN
       AUX := TRUE;
    I:=I+1;
  END;
  IF AUX THEN
  BEGIN
     IF NOT (DMGS.CDSQ_MDTICKET.STATE IN [DSEDIT,DSINSERT]) THEN
     BEGIN
        IF DMGS.CDSQ_MDTICKET.RecordCount > 0 THEN
             WITH DMGS.CDSQ_MDLINEATICKET  DO
             BEGIN
              IF NOT Active THEN
                OPEN;
              LAST;
              APPEND;
             END;
     END;
     IF (DMGS.CDSQ_MDLINEATICKET.STATE IN [DSEDIT,DSINSERT]) THEN
     BEGIN
        with DMGS.CDSQ_ARTICULOSAUX do
        BEGIN
         Close;
         DMGS.VARTICULOSAUX.ID := ' WHERE ID_ARTICULO='''+ARTICULO+''' ';
         DMGS.VARTICULOSAUX.TIPO  :='4';
         DMGS.VARTICULOSAUX.BORRADO := '0';
         dmgs.vARTICULOSaux.ORDEN := ' ORDER BY ID_ARTICULO,PROFUNDIDAD,COD_FAMILIA ';
         Open;
         IF RECORDCOUNT > 0 THEN
         BEGIN
             dmgs.cdsq_MDLINEATICKETID_ARTICULO.asstring:=ARTICULO;
             DMGS.CDSQ_MDLINEATICKETDESCRIPCION.ASSTRING:= dmgs.cdsq_articulosauxdescripcionticket.AsString ;
             DMGS.CDSQ_MDLINEATICKETPRECIO.ASfloat := ROUNDTO(DMGS.CDSQ_ARTICULOSAUXPRECIO_VENTA.asfloat,DMGS.DECIMALES);
             DMGS.CDSQ_MDLINEATICKETMARCA.ASSTRING := DMGS.CDSQ_ARTICULOSAUXMARCA.ASSTRING;
             I:=0;
             AUX:= FALSE;
             WHILE (I < SCREEN.FormCount) AND NOT AUX  DO
             BEGIN
               IF (SCREEN.Forms[I].Name = 'TICKET') THEN
               BEGIN
                  SCREEN.FORMS[I].ActiveMDIChild;
                  DMGS.CDSQ_MDLINEATICKETCANTIDAD.FOCUSCONTROL;
                  SELF.Hide;
                  AUX := TRUE;
//                  SELF.HIDE;
               END;
               I:= I+1;
             END;
//             TICKET.BringToFront ;
//             DMGS.CDSQ_MDLINEATICKETID_ARTICULO.FOCUSCONTROL;
//             SELF.HIDE;
         END;
         CLOSE;
        END;
     END;
  END;
END;
FUNCTION TSUBFAMILIA.CAMBIAR(AUX:STRING):STRING;
VAR NOMBRE:STRING;
    I:SMALLINT;
BEGIN
   NOMBRE := AUX;
   FOR I:= 1 TO 47 DO
     NOMBRE := STRINGREPLACE(NOMBRE,CHR(I),'_',[RFREPLACEALL,rfIgnoreCase]);
   FOR I:= 58 TO 64 DO
     NOMBRE := STRINGREPLACE(NOMBRE,CHR(I),'_',[RFREPLACEALL,rfIgnoreCase]);
   FOR I:= 123 TO 255 DO
     NOMBRE := STRINGREPLACE(NOMBRE,CHR(I),'_',[RFREPLACEALL,rfIgnoreCase]);
   RESULT := NOMBRE;
END;

end.

