! Clase : Gato_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)
 CODE
    SELF.Interactivo=Interactivo
    FREE(SELF.Parametros)

    Access:xParametros.Open
    Access:xParametros.UseFile

    SELF.SetDatos = SetDatos
    xPar:IdParametro=''
    xPar:SetDatos=SELF.SetDatos
    SET(xPar:PorId,xPar:PorId)
    LOOP UNTIL Access:xParametros.Next()
      IF xPar:SetDatos <> SELF.SetDatos
         BREAK
      END
      SELF.Parametros.QIdParametro     = UPPER(CLIP(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_D
      SELF.Parametros.QValor_Time      = xPar:VAlor_Time_T
      SELF.Parametros.QValor_Decimal   = xPar:Valor_Decimal
      SELF.Parametros.QValor_Memo      = xPar:Valor_Memo
      ADD(SELF.Parametros)
      IF ERRORCODE()
         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! - Gato_Parametros', ICON:Hand)
         STOP('NO PUDO AGREGAR AL QUEUE ERROR='&ERROR())
         RETURN Level:Fatal
      END
    END!LOOP
    SELF.Close
    RETURN Level:Benign
! ----------------------------------------------------------------------
xParametrosClass.Fetch  PROCEDURE(STRING IdParametro)
 CODE
    SORT(SELF.Parametros,'PorId')       !SELF.Parametros.QIdParametro)
    SELF.Parametros.QIdParametro = UPPER(CLIP(IdParametro))
    GET(SELF.Parametros,'PorId')        !SELF.Parametros.QIdParametro)
    IF ERRORCODE()
       IF SELF.Interactivo 
          BEEP(BEEP:SystemHand)
          MESSAGE('Ocurrio un error al recuperar el parametro.'&|
                  '|El parametro '& CLIP(IdParametro)& ' no se ha podido encontrar en la base.'&|
                  '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
                  'ERROR! - Gato_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
                RETURN SELF.Fetch(IdParametro)
             ELSE
                RETURN ''
             END
          OF BUTTON:No
             RETURN ''
          END !CASE
       ELSE
          LOOP nada# = 1 TO RECORDS(SELF.Parametros)
               GET(SELF.Parametros,nada#)
               IF ERRORCODE() 
                  BEEP(BEEP:SystemHand)  ;  YIELD()
                  MESSAGE('Ocurrio un error en el loop de recuperación del parametro '&|
                          CLIP(UPPER(IdParametro))&|
                          '||Error: ('&ERRORCODE()&') '&ERROR()&'.||Cantidad de Parametros: '& RECORDS(SELF.Parametros), |
                          'ERROR! - Gato_Parametros', ICON:Hand)
               ELSE
                   IF SELF.Parametros.QIdParametro = UPPER(CLIP(IdParametro))
                      RETURN Self.Value(SELF.Parametros.QTipoDato)
                      BREAK
                   END!IF  
                END!IF
          END!LOOP
                      
          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()&'.||Cantidad de Parametros: '& RECORDS(SELF.Parametros), |
                  'ERROR! - Gato_Parametros', ICON:Hand)
          RETURN ''
       END!IF
    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
     OF 'FOLDER'    ; RETURN ''
   ELSE
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al interpretar el tipo de dato.'&|
               '||Error: Tipo de dato desconocido.', |
               'ERROR! - Gato_Parametros', ICON:Hand)

       STOP('XPARAMS : ERROR SERIO TIPO DE DATO NO RECONOCIDO = '&TipoDato)
   END!CASE
! ----------------------------------------------------------------------
xParametrosClass.FetchServer  PROCEDURE(String IdParametro)
 CODE
    SORT(SELF.Parametros,'PorId')           !SELF.Parametros.QxPar:QIdParametro)
    SELF.Parametros.QxPar:QIdParametro = UPPER(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(IdParametro)& ' no se ha podido encontrar en la base.'& |
               '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
               'ERROR! - Gato_Parametros', ICON:Hand)
       RETURN Level:Fatal
    ELSE
    
    
       Access:xParametros.Open
       IF Access:xParametros.UseFile()
          MESSAGE('Error al abrir el archivo xparametros')
          RETURN Level:Fatal
       END!IF   
       
       CLEAR(xPar:Record)
       xPar:IdParametro = CLIP(IdParametro)
       xPar:SetDatos    = SELF.SetDatos

       SET(xPar:PorId,xPar:PorId) 
       LOOP UNTIL Access:xParametros.Next()
            IF xPar:SetDatos <> SELF.SetDatos
               MESSAGE('Error en el next')
               RETURN Level:Fatal
             END
            IF CLIP(UPPER(xPar:IdParametro)) <> CLIP(UPPER(IdParametro))

!       IF Access:xParametros.Fetch(xPar:PorId)   !ni idea porque no funciona el fetch

               BEEP(BEEP:SystemHand)  ;  YIELD() 
               MESSAGE('Ocurrio un error al recuperar el registro de parametros.'&|
                  '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
                  'ERROR! - Gato_Parametros  : '& SELF.SetDatos &' '& IdParametro, ICON:Hand)
               STOP('NO SE PUDO REALIZAR EL GET DE PARAMETROS')
               RETURN Level:Fatal
            END 
            BREAK
       END
    END
    RETURN Level:Benign
! ----------------------------------------------------------------------
xParametrosClass.LocalUpdate       PROCEDURE(String IdParametro,ANY Dato,<STRING Padre>, <SHORT Orden>, <ANY Nota>)
IsOpen BYTE
 CODE
    nada# = SELF.Fetch(IdParametro)
    IF NOT OMITTED(4) THEN XPar:IdParametroPadre = Padre ELSE XPar:IdParametroPadre = ''.
    IF NOT OMITTED(5) THEN XPar:Orden            = Orden ELSE XPar:Orden            = 0 .
    IF NOT OMITTED(6) THEN XPar:Nota             = Nota  ELSE XPar:Nota             = ''.
    CASE UPPER(CLIP(SELF.Parametros.QTipoDato))
      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_D    = Dato
      OF 'TIME'
         SELF.Parametros.QxPar:QValor_Time    = Dato
         xPar:Valor_Time_T    = 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
      OF 'FOLDER'
    ELSE
        BEEP(BEEP:SystemHand)  ;  YIELD()
        MESSAGE('Ocurrio un error al interpretar el tipo de dato.'&|
                '||Error: Tipo de dato no reconocido.', |
                'ERROR! - Gato_Parametros', ICON:Hand)

        STOP('XPARAMS : ERROR SERIO TIPO DE DATO NO RECONOCIDO = '&xPar:TipoDato)
    END!CASE

    PUT(SELF.Parametros)
    IF ERRORCODE() 
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al actualizar el registro de parametros.'&|
               '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
               'ERROR! - Gato_Parametros', ICON:Hand)
       STOP('NO SE PUDO REALIZAR EL PUT DE QPARAMETROS')
       RETURN Level:Fatal
    END
    
    RETURN Level:Benign
! ----------------------------------------------------------------------
xParametrosClass.Update       PROCEDURE(String IdParametro,ANY Dato,<STRING Padre>, <SHORT Orden>, <ANY Nota>)
IsOpen BYTE
 CODE
    IF SELF.FetchServer(IdParametro)
       MESSAGE('Error en el FetchServer')
       RETURN Level:Fatal
    END
    IF SELF.LocalUpdate(IdParametro,Dato,Padre,Orden,Nota)
       MESSAGE('Error en el LocalUpdate')
       RETURN Level:Fatal
    END
    IF Access:xParametros.Update()
       SELF.Close
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al actualizar el registro de parametros.'&|
               '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
               'ERROR! - Gato_Parametros', ICON:Hand)
       STOP('NO SE PUDO REALIZAR EL PUT DE PARAMETROS')
       RETURN Level:Fatal
    END
    SELF.Close
    RETURN Level:Benign
! ----------------------------------------------------------------------
xParametrosClass.Close       PROCEDURE()
 CODE
   IF Access:xParametros.Close()
      RETURN Level:Notify
   ELSE
      RETURN Level:Benign
   END
!-----------------------------------------------------------------
xParametrosClass.Delete  PROCEDURE(String IdParametro)
 CODE
    IF SELF.FetchServer(IdParametro)
       SELF.Close
       RETURN Level:Fatal
    END
    DELETE(SELF.Parametros)
    IF ERRORCODE() THEN
       SELF.Close
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al borrar el registro de parametros.'&|
               '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
               'ERROR! - Gato_Parametros', ICON:Hand)
       STOP('NO SE PUDO REALIZAR EL PUT DE QPARAMETROS')
       RETURN Level:Fatal
    END
    IF Relate:xParametros.Delete(0)
       SELF.Close
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al Borrar el registro de parametros.'&|
               '||Error: ('&ERRORCODE()&') '&ERROR()&'.', |
               'ERROR! - Gato_Parametros', ICON:Hand)
       STOP('NO SE PUDO REALIZAR EL PUT DE PARAMETROS')
       RETURN Level:Fatal
    END
    SELF.Close
    RETURN Level:Benign
! ----------------------------------------------------------------------
xParametrosClass.Insert       PROCEDURE(String IdParametro,STRING TipoDato,ANY Dato,STRING Descripcion,<STRING Padre>, <SHORT Orden>, <ANY Nota>)
Existe BYTE
 CODE
    Access:xParametros.Open
    Access:xParametros.UseFile
    Existe = True
    SORT(SELF.Parametros,'SetDatos,IdParametro')
    SELF.Parametros.QxPar:QIdParametro = UPPER(IdParametro)
    GET(SELF.Parametros,'SetDatos,IdParametro')
    IF ERRORCODE()
!       xPar:IdParametro = IdParametro
!       xPar:SetDatos    = SELF.SetDatos
!       IF Access:xParametros.Fetch(xPar:PorId)
!          BEEP(BEEP:SystemHand)  ;  YIELD()
!          MESSAGE('Ocurrio un error al insertar el registro de parametros.'&|
!             '||Error: Registro ya existe.(1)', |
!             'ERROR! - Gato_Parametros (1)', ICON:Hand)
!          SELF.Close
!          RETURN Level:Fatal
!       ELSE
          Existe = False
!       END
    ELSE
       BEEP(BEEP:SystemHand)  ;  YIELD()
       MESSAGE('Ocurrio un error al insertar el registro de parametros.'&|
               '||Error: Registro ya existe.(2)', |
               'ERROR! - Gato_Parametros (2)', ICON:Hand)
       RETURN Level:Fatal
    END
    xPar:SetDatos                = SELF.SetDatos
    xPar:IdParametro             = IdParametro
    SELF.Parametros.QIdParametro = UPPER(CLIP(IdParametro))
    xPar:Descripcion             = Descripcion
    SELF.Parametros.QDescripcion = Descripcion
    xPar:TipoDato                = TipoDato
    SELF.Parametros.QTipoDato    = TipoDato
    IF NOT OMITTED(6) THEN XPar:IdParametroPadre = Padre ELSE XPar:IdParametroPadre = ''.
    IF NOT OMITTED(7) THEN XPar:Orden            = Orden ELSE XPar:Orden            = 0 .
    IF NOT OMITTED(8) THEN XPar:Nota             = Nota  ELSE XPar:Nota             = ''.

!    MESSAGE(IdParametro &'|'& SELF.Parametros.QIdParametro &'|'& xPar:IdParametro)

    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_D    = Dato
      OF 'TIME'
         SELF.Parametros.QValor_Time    = Dato
         xPar:Valor_Time_T    = Dato
      OF 'DECIMAL'
         SELF.Parametros.QValor_Decimal = Dato
         xPar:Valor_Decimal = Dato
      OF 'MEMO'
         SELF.Parametros.QValor_Memo    = Dato
         xPar:Valor_Memo    = Dato
      OF 'FOLDER'
    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! - Gato_Parametros', ICON:Hand)
        RETURN Level:Fatal
    END!CASE
    ADD(SELF.Parametros)
    IF ERRORCODE() 
       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! - Gato_Parametros', ICON:Hand)
       RETURN Level:Fatal
    END
    IF Access:xParametros.Insert()
       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! - Gato_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_D)
Loc:Valor_Time      LIKE(xPar:Valor_Time_T)
Loc:Valor_Memo      LIKE(xPar:Valor_Memo)
Loc:SetDatos        LIKE(xPar:SetDatos)
Loc:IdParametro     LIKE(xPar:IdParametro)
Loc:Descrip     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:Descrip:Prompt),TRN
           ENTRY(@s80),AT(56,44,,10),USE(Loc:Descrip)
           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:Descrip=IdParametro
  Do SeleccionSegunTipo
  DISPLAY()
  SELECT(?Loc:Descrip)
      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:Descrip,'',0,'')
    OF 'INTEGER'
       RETURN SELF.Insert(Loc:IdParametro,Loc:TipoDato,Loc:Valor_Integer,Loc:Descrip,'',0,'')
    OF 'DATE'
       RETURN SELF.Insert(Loc:IdParametro,Loc:TipoDato,Loc:Valor_Date,Loc:Descrip,'',0,'')
    OF 'TIME'
       RETURN SELF.Insert(Loc:IdParametro,Loc:TipoDato,Loc:Valor_Time,Loc:Descrip,'',0,'')
    OF 'DECIMAL'
       RETURN SELF.Insert(Loc:IdParametro,Loc:TipoDato,Loc:Valor_Decimal,Loc:Descrip,'',0,'')
    OF 'MEMO'
       RETURN SELF.Insert(Loc:IdParametro,Loc:TipoDato,Loc:Valor_Memo,Loc:Descrip,'',0,'')
    END
