! Clase : Uni_Parametros
! ----------------------------------------------------------------------
xParametrosClass.Construct    PROCEDURE()
 CODE
    SELF.Parametros &= NEW(QxParametros)
    FREE(SELF.Parametros)
! ----------------------------------------------------------------------
xParametrosClass.Destruct  PROCEDURE()
 CODE
    FREE(SELF.Parametros)
    DISPOSE(SELF.Parametros)
! ----------------------------------------------------------------------
xParametrosClass.Init  PROCEDURE(SHORT SetDatos=0,BYTE Interactivo=0)
IsOpen BYTE
 CODE
    SELF.Interactivo=Interactivo
    IsOpen=False
    FREE(SELF.Parametros)
    OPEN(xParametros)
    IF ERRORCODE() AND ERRORCODE()<>52 THEN
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error en la inicialización de los parametros.'&|
               '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
               'ERROR! - Uni_Parametros', ICON:Hand)
       STOP('NO SE PUDO INICIALIZAR PARAMETROS')
       RETURN Level:Fatal
    ELSE
       IF ERRORCODE()=52 THEN
          IsOpen=True
       END
    END
    SELF.SetDatos = SetDatos
    xPar:IdParametro=''
    xPar:SetDatos=SELF.SetDatos
    SET(xPar:PorId,xPar:PorId)
    LOOP
      NEXT(xParametros)
      IF ERRORCODE() 
         IF ERRORCODE()=33 THEN BREAK 
         ELSE
            IF IsOpen=False THEN SELF.Close.
            BEEP(BEEP:SystemHand)  ;  YIELD()
            MESSAGE('Ocurrio un error en la inicialización de los parametros.'&|
                    '|No se pudo leer los datos del archivo.'& |
                    '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
                    'ERROR! - Uni_Parametros', ICON:Hand)
            STOP(ERROR())
            RETURN Level:Fatal
         END!IF
      END!IF
      IF xPar:SetDatos <> SELF.SetDatos THEN
         BREAK
      END
      SELF.Parametros.QIdParametro     = xPar:IdParametro
      SELF.Parametros.QDescripcion     = xPar:Descripcion
      SELF.Parametros.QTipoDato        = xPar:TipoDato
      SELF.Parametros.QValor_String    = xPar:Valor_String
      SELF.Parametros.QValor_Integer   = xPar:Valor_Integer
      SELF.Parametros.QValor_Date      = xPar:Valor_Date
      SELF.Parametros.QValor_Time      = xPar:VAlor_Time
      SELF.Parametros.QValor_Decimal   = xPar:Valor_Decimal
      SELF.Parametros.QValor_Memo      = xPar:Valor_Memo
      ADD(SELF.Parametros)
      IF ERRORCODE() THEN
         IF IsOpen=False THEN SELF.Close.
         BEEP(BEEP:SystemHand)  ;  YIELD()
         MESSAGE('Ocurrio un error en la inicialización de los parametros.'&|
                 '|No se pudo cargar en memoria los datos.'& |
                 '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
                 'ERROR! - Uni_Parametros', ICON:Hand)
         STOP('NO PUDO AGREGAR AL QUEUE ERROR='&ERROR())
         RETURN Level:Fatal
      END
    END!LOOP
    IF IsOpen=False THEN SELF.Close.
    RETURN Level:Benign
! ----------------------------------------------------------------------
xParametrosClass.Fetch  PROCEDURE(STRING IdParametro)
 CODE
    SORT(SELF.Parametros,'PorId')!SELF.Parametros.QIdParametro)
    SELF.Parametros.QIdParametro = IdParametro
    GET(SELF.Parametros,'PorId')!SELF.Parametros.QIdParametro)
    IF ERRORCODE()
       IF SELF.Interactivo THEN
          BEEP(BEEP:SystemHand)
          MESSAGE('Ocurrio un error al recuperar el parametro.'&|
                  '|El parametro '& CLIP(UPPER(IdParametro))& ' no se ha podido encontrar en la base.'&|
                  '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
                  'ERROR! - Uni_Parametros', ICON:Hand)

          BEEP(BEEP:SystemQuestion)
          CASE MESSAGE('Quiere agregar este parametro?'&|
               '|Parametro:'&IdParametro, |
               'xParametros Interactivo', ICON:Question, |
                BUTTON:Yes+BUTTON:No, BUTTON:Yes, 0)
          OF BUTTON:Yes
             IF SELF.VInsert(IdParametro)=Level:Benign THEN
                RETURN SELF.Fetch(IdParametro)
             ELSE
                RETURN ''
             END
          OF BUTTON:No
             RETURN ''
          END !CASE
       ELSE
          BEEP(BEEP:SystemHand)  ;  YIELD()
          MESSAGE('Ocurrio un error al recuperar el parametro.'&|
                  '|El parametro '& CLIP(UPPER(IdParametro))& ' no se ha podido encontrar en la base.'&|
                  '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
                  'ERROR! - Uni_Parametros', ICON:Hand)
          RETURN ''
       END
    ELSE
       RETURN Self.Value(SELF.Parametros.QTipoDato)
    END!IF
! ----------------------------------------------------------------------
xParametrosClass.Value PROCEDURE(STRING TipoDato)
 CODE
   CASE UPPER(CLIP(TipoDato))
     OF 'STRING'    ; RETURN SELF.Parametros.QValor_String
     OF 'INTEGER'   ; RETURN SELF.Parametros.QValor_Integer
     OF 'DATE'      ; RETURN SELF.Parametros.QValor_Date
     OF 'TIME'      ; RETURN SELF.Parametros.QValor_Time
     OF 'DECIMAL'   ; RETURN SELF.Parametros.QValor_Decimal
     OF 'MEMO'      ; RETURN SELF.Parametros.QValor_Memo
   ELSE
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al interpretar el tipo de dato.'&|
               '||Error: Tipo de dato desconocido.', |
               'ERROR! - Uni_Parametros', ICON:Hand)

   STOP('XPARAMS : ERROR SERIO TIPO DE DATO NO RECONOCIDO = '&TipoDato)
   END!CASE
! ----------------------------------------------------------------------
xParametrosClass.FetchServer  PROCEDURE(String IdParametro)
IsOpen     BYTE
 CODE
    IsOpen = False
    SORT(SELF.Parametros,'PorId')!SELF.Parametros.QxPar:QIdParametro)
    SELF.Parametros.QxPar:QIdParametro = IdParametro
    GET(SELF.Parametros,'PorId')!SELF.Parametros.QxPar:QIdParametro)
    IF ERRORCODE()
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al recuperar el registro de parametros.'&|
               '|El parametro '& CLIP(UPPER(IdParametro))& ' no se ha podido encontrar en la base.'& |
               '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
               'ERROR! - Uni_Parametros', ICON:Hand)
       RETURN Level:Fatal
    ELSE
       OPEN(xParametros)
       IF ERRORCODE() AND ERRORCODE()<>52 THEN
          BEEP(BEEP:SystemHand)  ;  YIELD()
          MESSAGE('Ocurrio un error al recuperar el registro de parametros.'&|
                  '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
                  'ERROR! - Uni_Parametros', ICON:Hand)
          STOP('NO SE PUDO ABRIR PARAMETROS')
          RETURN Level:Fatal
       ELSE
          IF ERRORCODE()=52 THEN IsOpen=True.
       END
       xPar:IdParametro = IdParametro
       xPar:SetDatos    = SELF.SetDatos
       GET(xParametros,xPar:PorId)
       IF ERRORCODE() THEN
          BEEP(BEEP:SystemHand)  ;  YIELD()
          MESSAGE('Ocurrio un error al recuperar el registro de parametros.'&|
                  '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
                  'ERROR! - Uni_Parametros', ICON:Hand)
          STOP('NO SE PUDO REALIZAR EL GET DE PARAMETROS')
          RETURN Level:Fatal
       END
    END
    IF IsOpen=False THEN
       RETURN Level:Benign
    ELSE
       RETURN Level:Notify
    END
! ----------------------------------------------------------------------
xParametrosClass.Update       PROCEDURE(String IdParametro,ANY Dato)
IsOpen BYTE
 CODE
    CASE SELF.FetchServer(IdParametro)
    OF Level:Notify
       IsOpen  = True
    OF Level:Benign
       IsOpen  = False
    ELSE
       SELF.Close
       RETURN Level:Fatal
    END

    CASE UPPER(CLIP(xPar:TipoDato))
      OF 'STRING'
         SELF.Parametros.QxPar:QValor_String  = Dato
         xPar:Valor_String  = Dato
      OF 'INTEGER'
         SELF.Parametros.QxPar:QValor_Integer = Dato
         xPar:Valor_Integer = Dato
      OF 'DATE'
         SELF.Parametros.QxPar:QValor_Date    = Dato
         xPar:Valor_Date    = Dato
      OF 'TIME'
         SELF.Parametros.QxPar:QValor_Time    = Dato
         xPar:Valor_Time    = Dato
      OF 'DECIMAL'
         SELF.Parametros.QxPar:QValor_Decimal = Dato
         xPar:Valor_Decimal = Dato
      OF 'MEMO'
         SELF.Parametros.QxPar:QValor_Memo    = Dato
         xPar:Valor_Memo    = Dato
    ELSE
        BEEP(BEEP:SystemHand)  ;  YIELD()
        MESSAGE('Ocurrio un error al interpretar el tipo de dato.'&|
                '||Error: Tipo de dato no reconocido.', |
                'ERROR! - Uni_Parametros', ICON:Hand)

        STOP('XPARAMS : ERROR SERIO TIPO DE DATO NO RECONOCIDO = '&xPar:TipoDato)
    END!CASE
    PUT(SELF.Parametros)
    IF ERRORCODE() THEN
       IF IsOpen=False THEN SELF.Close.
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al actualizar el registro de parametros.'&|
               '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
               'ERROR! - Uni_Parametros', ICON:Hand)
       STOP('NO SE PUDO REALIZAR EL PUT DE QPARAMETROS')
       RETURN Level:Fatal
    END
    PUT(xParametros)
    IF ERRORCODE() THEN
       IF IsOpen=False THEN SELF.Close.
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al actualizar el registro de parametros.'&|
               '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
               'ERROR! - Uni_Parametros', ICON:Hand)
       STOP('NO SE PUDO REALIZAR EL PUT DE PARAMETROS')
       RETURN Level:Fatal
    END
    IF IsOpen=False THEN SELF.Close.
    RETURN Level:Benign
! ----------------------------------------------------------------------
xParametrosClass.Close       PROCEDURE()
 CODE
   Close(xParametros)
   IF ERRORCODE() THEN
      RETURN Level:Notify
   ELSE
      RETURN Level:Benign
   END
! ----------------------------------------------------------------------
xParametrosClass.Insert       PROCEDURE(String IdParametro,STRING TipoDato,ANY Dato,STRING Descripcion)
Existe BYTE
 CODE
    Existe = True
    SORT(SELF.Parametros,'PorId')
    SELF.Parametros.QxPar:QIdParametro = IdParametro
    GET(SELF.Parametros,'PorId')
    IF ERRORCODE()
       OPEN(xParametros)
       IF ERRORCODE() AND ERRORCODE()<>52 THEN
          BEEP(BEEP:SystemHand)  ;  YIELD()
          MESSAGE('Ocurrio un error al recuperar el registro de parametros.'&|
                  '|NO SE PUDO ABRIR PARAMETROS'&|
                  '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
                  'ERROR! - Uni_Parametros', ICON:Hand)
          RETURN Level:Fatal
       ELSE
          xPar:IdParametro = IdParametro
          xPar:SetDatos    = SELF.SetDatos
          GET(xParametros,xPar:PorId)
          IF NOT ERRORCODE() THEN
             BEEP(BEEP:SystemHand)  ;  YIELD()
             MESSAGE('Ocurrio un error al insertar el registro de parametros.'&|
                     '||Error: Registro ya existe.', |
                     'ERROR! - Uni_Parametros', ICON:Hand)
             SELF.Close
             RETURN Level:Fatal
          ELSE
             Existe = False
          END
       END
    ELSE
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al insertar el registro de parametros.'&|
               '||Error: Registro ya existe.', |
               'ERROR! - Uni_Parametros', ICON:Hand)
       RETURN Level:Fatal
    END
    IF Existe = False THEN
    END
    xPar:SetDatos                = SELF.SetDatos
    xPar:IdParametro             = IdParametro
    SELF.Parametros.QIdParametro = Descripcion
    xPar:Descripcion             = Descripcion
    SELF.Parametros.QDescripcion = IdParametro
    xPar:TipoDato                = TipoDato
    SELF.Parametros.QTipoDato    = TipoDato

    SETNULL(xPar:Valor_String)
    SETNULL(xPar:Valor_Integer)
    SETNULL(xPar:Valor_Date)
    SETNULL(xPar:Valor_Time)
    SETNULL(xPar:Valor_Decimal)
    SETNULL(xPar:Valor_Memo)

    CASE UPPER(CLIP(TipoDato))
      OF 'STRING'
         SELF.Parametros.QValor_String  = Dato
         xPar:Valor_String  = Dato
      OF 'INTEGER'
         SELF.Parametros.QValor_Integer = Dato
         xPar:Valor_Integer = Dato
      OF 'DATE'
         SELF.Parametros.QValor_Date    = Dato
         xPar:Valor_Date    = Dato
      OF 'TIME'
         SELF.Parametros.QValor_Time    = Dato
         xPar:Valor_Time    = Dato
      OF 'DECIMAL'
         SELF.Parametros.QValor_Decimal = Dato
         xPar:Valor_Decimal = Dato
      OF 'MEMO'
         SELF.Parametros.QValor_Memo    = Dato
         xPar:Valor_Memo    = Dato
    ELSE
        SELF.Close
        BEEP(BEEP:SystemHand)  ;  YIELD()
        MESSAGE('Ocurrio un error al interpretar el tipo de dato.'&|
                '||Error: Tipo de dato no reconocido.'&|
                'Tipo de dato:'&TipoDato,|
                'ERROR! - Uni_Parametros', ICON:Hand)
        RETURN Level:Fatal
    END!CASE
    ADD(SELF.Parametros)
    IF ERRORCODE() THEN
       SELF.Close
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al actualizar el registro de parametros.'&|
               'NO SE PUDO REALIZAR EL ADD DE QPARAMETROS'&|
               '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
               'ERROR! - Uni_Parametros', ICON:Hand)
       RETURN Level:Fatal
    END
    ADD(xParametros)
    IF ERRORCODE() THEN
       SELF.Close
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al actualizar el registro de parametros.'&|
               'NO SE PUDO REALIZAR EL ADD DE PARAMETROS'&|
               '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
               'ERROR! - Uni_Parametros', ICON:Hand)
       RETURN Level:Fatal
    END
    SELF.Close
    RETURN Level:Benign
! ----------------------------------------------------------------------
xParametrosClass.VInsert       PROCEDURE(String IdParametro)
Loc:Valor_String    LIKE(xPar:Valor_String)
Loc:Valor_Integer   LIKE(xPar:Valor_Integer)
Loc:Valor_Decimal   LIKE(xPar:Valor_Decimal)
Loc:Valor_Date      LIKE(xPar:Valor_Date)
Loc:Valor_Time      LIKE(xPar:Valor_Time)
Loc:Valor_Memo      LIKE(xPar:Valor_Memo)
Loc:SetDatos        LIKE(xPar:SetDatos)
Loc:IdParametro     LIKE(xPar:IdParametro)
Loc:Descripcion     LIKE(xPar:Descripcion)
Loc:TipoDato        LIKE(xPar:TipoDato)
AskWindow WINDOW('Actualizar la Tabla xParametros'),AT(,,193,167),FONT('MS Sans Serif',8,,FONT:bold), |
         CENTER,IMM,ALRT(EnterKey),GRAY,MASK,MDI
       SHEET,AT(2,1,189,76),USE(?CurrentTab),JOIN
         TAB('General'),USE(?Tab:1)
           PROMPT('Set Datos:'),AT(20,18),USE(?Loc:SetDatos:Prompt)
           ENTRY(@n-7),AT(56,18,60,10),USE(Loc:SetDatos),SKIP,RIGHT(1),READONLY
           PROMPT('Id Parametro:'),AT(10,31),USE(?Loc:IdParametro:Prompt),TRN
           ENTRY(@s20),AT(56,31,,10),USE(Loc:IdParametro),SKIP,LEFT(1),READONLY
           PROMPT('Descripcion:'),AT(13,44),USE(?Loc:Descripcion:Prompt),TRN
           ENTRY(@s80),AT(56,44,,10),USE(Loc:Descripcion)
           PROMPT('Tipo de Dato:'),AT(9,57),USE(?Prompt10)
           LIST,AT(56,57,76,10),USE(Loc:TipoDato),FORMAT('20L'),DROP(10),FROM('STRING|INTEGER|DATE|TIME|DECIMAL|MEMO')
         END
       END
       SHEET,AT(2,78,189,66),USE(?Sheet2),WIZARD
         TAB('Decimal'),USE(?TDecimal)
           PROMPT('Valor Decimal:'),AT(5,94),USE(?Loc:Valor_Decimal:Prompt),TRN
           ENTRY(@n-20.4),AT(54,94,,10),USE(Loc:Valor_Decimal),DECIMAL(22),INS
         END
         TAB('String'),USE(?TString)
           PROMPT('Valor String:'),AT(11,94),USE(?Loc:Valor_String:Prompt),TRN
           ENTRY(@s40),AT(54,94,102,10),USE(Loc:Valor_String)
         END
         TAB('Integer'),USE(?TInteger)
           PROMPT('Valor Integer:'),AT(7,94),USE(?Loc:Valor_Integer:Prompt),TRN
           ENTRY(@n-14),AT(54,94,,10),USE(Loc:Valor_Integer),RIGHT(1),INS
         END
         TAB('Memo'),USE(?TMemo)
           PROMPT('Valor Memo:'),AT(10,94),USE(?Loc:Valor_Memo:Prompt),TRN
           TEXT,AT(54,94,129,39),USE(Loc:Valor_Memo),VSCROLL
         END
         TAB('Date'),USE(?TDate)
           PROMPT('Valor Date:'),AT(17,94),USE(?Loc:Valor_Date:Prompt),TRN
           ENTRY(@d6),AT(54,94,,10),USE(Loc:Valor_Date)
         END
         TAB('Time'),USE(?TTime)
           PROMPT('Valor Time:'),AT(14,94),USE(?Loc:Valor_Time:Prompt),TRN
           ENTRY(@t4),AT(54,94,,10),USE(Loc:Valor_Time)
         END
       END
       BUTTON('F2-Aceptar'),AT(45,146,69,18),USE(?OK),FLAT,LEFT,KEY(F2Key),ICON(ICON:Tick), |
           DEFAULT
       BUTTON('F10-Cancelar'),AT(121,146,69,18),USE(?Cancel),FLAT,LEFT,KEY(F10Key),ICON(ICON:Cross)
     END
loc:ok  BYTE
 CODE
  loc:ok = False
  OPEN(AskWindow)
  Loc:TipoDato='STRING'
  Loc:IdParametro=IdParametro
  Loc:Descripcion=IdParametro
  Do SeleccionSegunTipo
  DISPLAY()
  SELECT(?Loc:Descripcion)
      ACCEPT
        CASE EVENT()
        OF Event:OpenWindow
            CYCLE
        OF Event:CloseWindow
        OF Event:Timer
            CYCLE
        OF EVENT:AlertKey
           CASE KEYCODE()
             OF EnterKey
                MiControl# = FOCUS()
                CASE MiControl#{Prop:Type}
                  OF CREATE:TEXT  ! Si es un memo
                     PRESSKEY(ShiftEnter)
                     CYCLE
                  OF CREATE:Button
                     POST(EVENT:ACCEPTED,MiControl#)
                     CYCLE
                  ELSE
                     IF FOCUS()<> ?OK
                        PRESSKEY(TabKey)
                        CYCLE
                     ELSE
                        ! Se presiono el ENTER estando posicionado el OK
                        POST(Event:Accepted,?OK)
                        CYCLE
                     END!IF
                END!CASE
           END!CASE
        OF EVENT:Accepted
           CASE FIELD()
           OF ?OK
              loc:ok = True
              POST(Event:CloseWindow)
           OF ?Cancel
              loc:ok = False
              POST(Event:CloseWindow)
           OF ?Loc:TipoDato
              Do SeleccionSegunTipo
           END!END FIELD()
        END!END EVENT()
      END!ACCEPT
  CLOSE(AskWindow)
  IF loc:ok THEN
     Do InsertarSegunTipo
  ELSE
     RETURN Level:Notify
  END

SeleccionSegunTipo ROUTINE
    CASE Loc:TipoDato
    OF 'STRING'
       SELECT(?TSTRING)
       Loc:Valor_Integer=0
       Loc:Valor_Date   =0
       Loc:Valor_Time   =0
       Loc:Valor_Decimal=0
       Loc:Valor_Memo   =''
    OF 'INTEGER'
       SELECT(?TINTEGER)
       Loc:Valor_Date   =0
       Loc:Valor_Time   =0
       Loc:Valor_Decimal=0
       Loc:Valor_Memo   =''
       Loc:Valor_String =''
    OF 'DATE'
       SELECT(?TDATE)
       Loc:Valor_Integer=0
       Loc:Valor_Time   =0
       Loc:Valor_Decimal=0
       Loc:Valor_Memo   =''
       Loc:Valor_String =''
    OF 'TIME'
       SELECT(?TTIME)
       Loc:Valor_Integer=0
       Loc:Valor_Date   =0
       Loc:Valor_Decimal=0
       Loc:Valor_Memo   =''
       Loc:Valor_String =''
    OF 'DECIMAL'
       SELECT(?TDECIMAL)
       Loc:Valor_Integer=0
       Loc:Valor_Date   =0
       Loc:Valor_Time   =0
       Loc:Valor_Memo   =''
       Loc:Valor_String =''
    OF 'MEMO'
       SELECT(?TMEMO)
       Loc:Valor_Integer=0
       Loc:Valor_Date   =0
       Loc:Valor_Time   =0
       Loc:Valor_Decimal=0
       Loc:Valor_String =''
    END
InsertarSegunTipo ROUTINE
    CASE Loc:TipoDato
    OF 'STRING'
       RETURN SELF.Insert(Loc:IdParametro,Loc:TipoDato,Loc:Valor_String,Loc:Descripcion)
    OF 'INTEGER'
       RETURN SELF.Insert(Loc:IdParametro,Loc:TipoDato,Loc:Valor_Integer,Loc:Descripcion)
    OF 'DATE'
       RETURN SELF.Insert(Loc:IdParametro,Loc:TipoDato,Loc:Valor_Date,Loc:Descripcion)
    OF 'TIME'
       RETURN SELF.Insert(Loc:IdParametro,Loc:TipoDato,Loc:Valor_Time,Loc:Descripcion)
    OF 'DECIMAL'
       RETURN SELF.Insert(Loc:IdParametro,Loc:TipoDato,Loc:Valor_Decimal,Loc:Descripcion)
    OF 'MEMO'
       RETURN SELF.Insert(Loc:IdParametro,Loc:TipoDato,Loc:Valor_Memo,Loc:Descripcion)
    END
