TTABLE CLASS

//
// OpenTable(cSql,lFill,oOdbc,lChecktable,lExcluye,lDicc,lLimit,lLower)
// Parámetros
//
// Devuele en Cursor Virtual mediante la clase TTABLE contentivo de los registros de una Sentencia SQL mediante la conexion con una base de datos bien sea Nativa MySQL u conexión ODBC
//
1 cSql := "DPUSUARIOS" // Nombre de la tabla o Sentencia SQL, caso de nombre de la tabla "DPUSUARIOS" asumirá "SELECT * FROM DPUSUARIOS"
2 lFill :=.T. // Valor por defecto es .T. Lectura de Registro o Cursor Vacio para insertar Registros
3 oOdbc := NIL // Objeto de la Base de datos, En caso de ser vacio será obtenido mediante la funcion OpenOdbc() desde el diccionario de datos según nombre de la tabla
4 lCheckTable :=.F. // Revisa la sintaxis SQL y Existencia de las tablas vinculadas de la Sentencia SQL
5 lExcluye :=oDp:lExcluye // Agrega exclusiones en la clausula WHERE
6 lDicc :=.T. // Valida las tablas en el diccionario de Datos, para ser utilizado con otras bases de datos, indicar .F.
7 lLimit :=.F. // Agrega paginado mediante la sentencia LIMIT
8 lLower :=.F. // Convierte el nombre de las tablas en minúscula, según el diccionario de datos.
 
FUNCTION OpenTable(cSql,lFill,oOdbc,lChecktable,lExcluye,lDicc,lLimit,lLower)
   LOCAL oCursor,cTable:=CTABLE(cSql)

   DEFAULT oOdbc:=OPENODBC(cTable)

   oCursor:=TTable():New( NIL, cSql, oOdbc, NIL, IIF(lFill, 0, 1 ), NIL, NIL, NIL, lLower)

RETURN oCursor

METHOD New(oCursor,cSql,oOdbc,cTable,nOption,cPrimary,lCheck,lLimit,lLower) CLASS Ttable
     LOCAL oCursor,cTable:=CTABLE(cSql)

     DEFAULT oOdbc:=OPENODBC(cTable)

   IF oOdbc:ClassName()<>”TODBC”
      oCursor:=MyTable(cSql,.T.,oOdbc:cDsn,NIL,oOdbc)
   ELSE
      oCursor :=oOdbc:Query(cSql)
   ENDIF

RETURN oCursor/

//EOF

CLASS Ttable

    DATA oCursor
    DATA oOdbc
    DATA oScript

    DATA nOption
    DATA nArrayAt
    DATA nRecord
    DATA nPos      // Posición del Ultimo Campo
    DATA nRecno    // Posicion del Registro
    DATA nOrder    // Orden de los Datos
    DATA nCountIns // Cantidad de Registros Contados
    DATA nInsert   // Cantidad de Registros que Seran Incluidos
    DATA nSeconds
    DATA nHandler

    DATA aDataFill INIT {}    // Data Completa de la tabla (Original)
    DATA aBodyLink           // Campos de enlace
    DATA aHeadLink           // Campos de la Tabla enlazadora
    DATA aFieldsNew
    DATA aFieldsFrom
    DATA aFields
    DATA aAddFields        // Campos Agregados en ADDFIELDS
    DATA aBuffers
    DATA aDataOrg          // Data Completa de la taba
    DATA aVars              // Control de los Campos
    DATA aRecord            // Control del Registro
    DATA aFieldSpeed
    DATA aFieldTable
    DATA aIntRef INIT {}      // JN 12/03/2014 Contiene Datos de la Integridad Referencial
    DATA aRecClone INIT {}    // JN 01/11/2014 Copia del Registro de Integridad Referencial
    DATA aFieldsTable INIT {} // Campos exclusivos de la Tabla
    DATA aTotales INIT {}

    DATA cTable
    DATA cFileName
    DATA cWhere                // Condicion del Enlace entre tablas
    DATA cSql
    DATA cPrimary
    DATA cFieldOrder           // permite establecer Orden
    DATA cField_Order INIT ""  // Orden segun ::Sort()

    DATA cName          // Nombre del Campo
    DATA cError
    DATA cSingular      // Nombre Singular de la Tabla
    DATA cType          // Tipo de Data en ODBC
    DATA cInsert        // Indica el Super INSERT INTO de varios registros
    DATA cMsgInt INIT "Requiere Ejecutar metodo IsChkIntRef()"
    DATA cWhereRecord INIT "" // Where con todos los campos del Registros
    DATA cDpXbaseLine INIT "DpXbase: "+oDp:cScript+CRLF+" Función: "+oDp:cScrFunc+" Línea: "+oDp:cScrLine // oDp:cDpXbaseLine // 
    DATA cFieldAud INIT "" // Campo de Auditoria Segun formulario tdocgrid


    DATA lFromCursor
    DATA lDesc INIT .F. // Orden según ::Sort()

    DATA lAppend
    DATA lAutomatic     // Modo de Asignación de Valores
    DATA lFound
    DATA lOnly          // Solo campos de la tabla
    DATA lEof           // Control de Navegación
    DATA lBof
    DATA lMemo          // Indica que Hay Campo Memo
    DATA lIsDef
    DATA lMySqlNativo
    DATA lReloadData    // Luego que Incluye requiere Recargar
    DATA lLock INIT .F.
    DATA lSetFieldDef INIT .T.
    DATA lLower INIT .F.
    DATA lCreaRegIntRef INIT .F. // Crear Registros de Integridad Referencial en Commit, clase TDPEDIT debe ejecutarlo en LOAD y por esto debe asigar .f. a DATA lCreaRegIntRef
    DATA lInsertReplace INIT .F. // Realiza Insert INTO Mediante Sentencia REPLACE
    DATA lUpdate INIT .F.        // Si append() es modificar su valor sera .t. y agrega Where en COMMIT
    DATA lRemote INIT .F       // Indica la Tabla tiene conexion Remota
    DATA lMsgError INIT .F     // Mostrar Error en ONEROR

    DATA lSET_FOREIGN INIT .T.

    METHOD New( oCursor , cSql , oOdbc , cTable , nOption , cPrimary , lCheck , lLimit ,lLower ) CONSTRUCTOR
    METHOD Replace(cField, cValor , nLen, nDec )
    METHOD Replaceifempty(cField, cValor , nLen, nDec) INLINE IF (Empty(::Get(cField)), ::Replace(cField, cValor , nLen, nDec ),NIL)
    METHOD DbStruct() INLINE ::aFields

    METHOD ReplaceSpeed(cField, cValor , lMsg)
    METHOD CommitSpeed(lSave)
    METHOD Commit(cWhere)
    METHOD Append() INLINE IF(::RecCount()=0,(::lUpdate:=.F.,::cWhere:="",::AppendBlank()),::lUpdate:=.T.) // JN 01/07/2017, Agrega si el registro esta Vacio ::lAppend:=.T.
    METHOD SetAuditar(cFieldAud) // Requiere oTable:cPrimary:="Clave"
    METHOD InitFields()
    METHOD AddRecord()
    METHOD GetExcluye() INLINE GetExcluye(::cTable)[2]
    METHOD ATOTAL(cField)

    METHOD LockTable()
    METHOD UnLockTable()

    METHOD SetArray(aData,aFields)
    METHOD Count(cWhere) INLINE Count(::cTable,cWhere)
    METHOD CopiaReg(oOrigen)
    METHOD GetPicture(nField,lMiles) // Genera el picture del Campo
    METHOD Load(nRecord)
    METHOD SaveSpeed()
    METHOD SeekBin(uValue,cField,lSoft)
    METHOD CTONUM(cField) // Convierte en Numerico
    METHOD CTOLOG(cField) // Convierte en Logico
    METHOD CTOASLOG()     // Convierte todos los Campos en Lógicos Cuando Viene de SELECT 0 AS LOGICO

    METHOD SetDefault() INLINE EJECUTAR("DPTABLESETDEF",SELF)
    METHOD CTOD(cField) // Convierte en Numerico
    METHOD ChkDsn()     // Revisa Dsn

    METHOD FieldName(cField)
    METHOD ChkIntRef(cField) // Revisa Valores Faltantes para la Integridad Ref
    METHOD IsChkIntRef(lSay) INLINE (oDp:lChkInt:=EJECUTAR("CHKINTREF",SELF,lSay) ,;
              ::aIntRef:=ACLONE(oDp:aLinks),;
              ::cMsgInt:=oDp:cMsgChkInt,; oDp:lChkInt)

    METHOD ViewIntRef() INLINE (::IsChkIntRef(),ViewArray(::aIntRef))

    METHOD FieldGet(nPos)
    METHOD NewRecord() // Realiza un Nuevo Registro
    METHOD FieldPut(nPos,uValue) INLINE ::Replace(::aFields[nPos,1],uValue)
    METHOD ADEL(nPos)            INLINE ADEL(::aDataFill,nPos)

    METHOD _FieldGet(nPos) // Lee desde la Data Original
    METHOD FieldPos(cField)
    METHOD RecCount()         INLINE LEN(::aDataFill) // Cantidad de Registros
    METHOD nRecCount()        INLINE LEN(::aDataFill)
    METHOD Fieldtype(nField)  INLINE (nField:=::FieldPos(nField),IF(nField>0,::aFields[nField,2],""))
    METHOD FieldLen(nField  INLINE (nField:=::FieldPos(nField),IF(nField>0,::aFields[nField,3],""))
    METHOD FieldDec(nField)   INLINE (nField:=::FieldPos(nField),IF(nField>0,::aFields[nField,4],""))
    METHOD Recno()            INLINE (::nRecno)

    METHOD GoTop()                      INLINE (::nRecno:=1,::UpDateFields())
    METHOD GoTo(nRecno)                 INLINE (::nRecno:=nRecno,::nArrayAt:=nRecno,::UpDateFields())
    METHOD GoBottom()                   INLINE (::Goto(LEN(::aDataFill)))
    METHOD Eof()                        INLINE (::nRecno>LEN(::aDataFill).OR. Empty(::aDataFill)) // ::nRecno=0)
    METHOD Bof()                        INLINE (::nRecno<1)
    METHOD Skip(nSkip,lView)
    METHOD GotoSkip(nStep,cField,cWhere)
    METHOD DbSkip(nSkip,lView)          INLINE (::Skip(nSkip,lView))
    METHOD DbEval(bAction,bWhile,bFor)
    METHOD Fcount()                     INLINE len(::aFields)
    METHOD nFields()                    INLINE len(::aFields)
    METHOD GotoId(nRecord)              INLINE ::Goto(nRecord)
    METHOD Execute(cSql,cCommand)
    METHOD GetTotal(cField)
    METHOD GetMax(cField,cWhere,nLimit) INLINE SqlGetMax(::cTable,cField,cWhere,nLimit,NIL,::oOdbc)
    METHOD TotalField(cField)
    METHOD CreaRegIntRef(lRun) INLINE (RUNNEW("DPCREAREGINTREF",SELF,lRun),;::lCreaRegIntRef:=.F.)
    METHOD ISFIELD(cField)
    METHOD CLOSE()                      INLINE ::End()

    METHOD SetInsert(nRecord) INLINE (nRecord:=IIF(nRecord=NIL,100,nRecord),::nInsert:=nRecord,::nCountIns:=0)

    // Metodo para el Desplazamiento en Documentos
    METHOD GotoMax(cField,cWhere,lMax)
    METHOD GotoMin(cField,cWhere,lMax) INLINE ::GotoMax(cField,cWhere,.F.)

    // Determina la Siguiente/Anterior Clave
    METHOD GetNext(cField,uValue,lMax)
    METHOD GetPrev(cField,uValue,lMax)   INLINE ::GetNext(cField,uValue,.F.)
    METHOD CTODBF(cFile,cRdd)
    METHOD CTOHTML(cFile)                INLINE EJECUTAR("TABLETOHTML",Self,cFile)
    METHOD GETWHERERECORD(cFields,lAll)  INLINE (::cWhereRecord:=EJECUTAR("GETWHERERECORD",SELF,cFields,lAll))

    METHOD CTOTXT(cFile)
    METHOD CLONE(oTable)
    METHOD USE() INLINE NIL // Compatible MyTable Nativo
    METHOD Browse(lOrder,cTitle, lMdi)
    METHOD BRW(lOrder) INLINE EJECUTAR("BRWDINAMICO",SELF,NIL,lOrder)

    METHOD UpDateFields()
    METHOD GetValKey(cFieldKey)
    METHOD GetWhereKey(cFieldKey)
    METHOD IsOk() INLINE (ValType(::aFields)="A" .AND. !Empty(::aFields))
    METHOD DeleteAll(lIni) // Borra todos los Registros
    METHOD Delete(cWhere)
    METHOD ExportBD(oOdbc,cTable,lDelete,oSay) INLINE EJECUTAR("DBTABLEXPORT",Self,oOdbc,cTable,lDelete,oSay)

    METHOD aFill() INLINE (::aDataFill:=::oCursor:aFill()) // ,::Gotop()) // ,::GoTop())

    METHOD DbSeek(uValue,lSoftSeek,cField)
    METHOD AppendBlank()

    METHOD AddFields(cField,uValue)
    METHOD Reload() // Recarga el Query
    METHOD Refresh()

    METHOD GetIndex(lViews)              INLINE ::oOdbc:GetIndex(::cTable,lViews) // JN 29/12/2002
    METHOD IndexKey(nOrder)              INLINE ::oOdbc:IndexKey(::cTable,nOrder) // JN 29/12/2002
    METHOD isIndex(cIndex)               INLINE ::oObdc:IsIndex(::cTable,cIndex )
    METHOD GetDataKey(nOrder)
    METHOD GetValue(cField) //INLINE ::FieldGet(::FieldPos(cField))
    METHOD GenSeek(cKey,nOrder)
    METHOD SeekTable(cField,oGet,cWhere,oSay)
    METHOD ShowError(cTitle)
    METHOD MsgError(cTitle)              INLINE ::ShowError(cTitle)
    METHOD DbSeek2(cKey,lSoftSeek,nOrder)INLINE ::oOdbc:DbSeek(::cTable,cKey,lSoftSeek,nOrder,::GenSeek(cKey,nOrder))
    METHOD AddField(cField,cType,nLen,nDec) // Agregar un Campo Virtual
    METHOD GetWhere()                       // Devuelve Where Segun Valor de todos sus Campos

    METHOD Add   ( cName, xValue )
    METHOD Get   ( cName )
    METHOD Set   ( cName, xValue )
    METHOD GetPos( cName )
    METHOD IsDef ( cName )

    METHOD SetOrder(cField,lDesc) INLINE ::Sort(cField,lDesc)
    METHOD Sort(cFields,lDesc)
    METHOD Inspect()              INLINE EJECUTAR("INSPECT",Self)

    METHOD ViewArray() INLINE ViewArray(::aDataFill,::cTable)

    METHOD SetForeignkeyOff() INLINE ::EXECUTE("SET FOREIGN_KEY_CHECKS = 0"), ::lSET_FOREIGN:=.F.
    METHOD SetForeignkeyOn()  INLINE ::EXECUTE("SET FOREIGN_KEY_CHECKS = 1"), ::lSET_FOREIGN:=.T.

    METHOD HandleEvent(nMsg, nWParam, nLParam) EXTERN ;
                       WndHandleEvent(Self, nMsg, nWParam, nLParam)

    METHOD End()

    ERROR HANDLER OnError(cMsg, nPar1,nPar2,nPar3,nPar4,nPar5,nPar6,nPar7,nPar8,nPar9,nPar10,nPar11,nPar12,nError)

ENDCLASS
//EOF