Clipper On Line • Ver Tópico - ADOxb Erro

ADOxb Erro

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

ADOxb Erro

Mensagempor Zergar » 17 Ago 2009 00:15

Ola, depois de procurar por todo o forum sobre o problema e nao encontrar a resposta gostaria da ajuda de voces.

Preciso acessar uma tabela no formato MDB (Access), e lancar alguns registros de movimento de entrada e saida de produtos para critica e envio atraves do Software I-Simp e adequar nossa aplicacao junto a ANP.

Lendo bastante no forum, acredito eu a melhor solucao sera o uso da do projeto do Rochinha (ADOxb), uso Xharbour 121 + FiveWin 9.05 + BCC.

Bem estou tentanto compilar um exemplo chamando Custumer e estou tendo erro justamente na ADOxb.ch Linha 52 e ADOxb.prg linha 265, os erros sao o seguinte:

adoxb.ch - E0017 Ambiguous Match Pattern in #Translate / #Command

adoxb.prg - E0039 Syntax Error at ´CADORDD´

Segue abaixo os respectivos Codigos:

adoxb.ch
**************************************************************************************
*
* Cursor Location
*
* adUseServer           2 Atua no lado servidor
* adUseClient           3 Atua no lado cliente
*
* Cursor Type
*
* adOpenForwardOnly     0 O cursor so navega para frente. Bom para listar dados
* adOpenKeyset          1 Nao permite ver os registro adicionados e eliminados
* adOpenDynamic         2 Aceita todas operacoes do utilizador e dos outros
* adOpenStatic          3 Serve apenas para procurar dados ou gerar relatorios
*
* Lock Type Enum - Contantes de Seguranca
*
* adLockReadOnly        1 Apenas pode ler os registros
* adLockPessimistic     2 O fornecedor dos dados fecha o registro apos edicao
* adLockOptimistic      3 O fornecedor dos dados fecha o registro apos chamar o update
* adLockBatchOptimistic 4 O mesmo que Optmistic mas para sequencia de comandos
*
* AllowNumsEnum
*
* adIndexNullsAllow     0
* adIndexNullsDisallow  1
* adIndexNullsIgnore    2
* adIndexNullsIgnoreAny 4
*
**************************************************************************************

#command ADO CONNECT <StrDriver> [<disconected:DISCONECTED>] => ADOCONNECT( <StrDriver>, [<.disconected.>] )
#command ADO DISCONNECT             => ADODISCONNECT()
#command ADO APPEND BLANK           => ADOAPPEND()
#command ADO EDIT                   => ADOEDIT()
#command ADO COMMIT [<save:SAVE>]   => ADOCOMMIT( [<.save.>] )
#command ADO SKIP                   => ADOSKIP( 1 )
#command ADO SKIP <num>             => ADOSKIP( <num> )
#command ADO DELETE                 => ADODELETE()
#command ADO REPLACE <f1> WITH <v1> => ADOREPLACE( <(f1)>, <v1> )
#command ADO GOTOP                  => ADOGOTOP()
#command ADO GOBOTTOM               => ADOGOBOTTOM()
#command ADO SET FILTER TO          => ADOSETFILTER()
#command ADO SET FILTER TO <xpr>    => ADOSETFILTER( <xpr> )
#command ADO SAVE <(CfILE)>         => ADOSAVE( <(CfILE)> )
#command ADO EXECUTE <*Sql*>        => ADOEXECUTE( <(Sql)> )
#command ADO LOCATE <xpr>           => ADOLOCATE( <xpr> )
#command ADO REGLOCK                => ADOREGLOCK()
#command ADO CLOSE                  => ADOCLOSE()
#command ADO CLOSE ALL              => ADOCLOSEALL()
#command ADO USE                    => ADOUSE()
#command ADO USE <(StrDatabase)> [<shared:SHARED>] => ADOUSE( <(StrDatabase)>, [<.shared.>] )
#command ADO SORT ON [<(cF)>][<(x)>]=> ADOSORT( [<(cF)>][, <(x)>] )
#command ADO SELECT <(cRecordSet)>  => ADOSELECT( <(cRecordSet)> )

#xcommand ADO SQL DELETE <*cSQL*>   => ADOEXECUTE( 'DELETE '+ <(cSQL)> )
#xcommand ADO SQL INSERT <*cSQL*>   => ADOEXECUTE( 'INSERT '+ <(cSQL)> )
#xcommand ADO SQL UPDATE <*cSQL*>   => ADOEXECUTE( 'UPDATE '+ <(cSQL)> )
#xcommand ADO SQL ALTER  <*cSQL*>   => ADOEXECUTE( 'ALTER ' + <(cSQL)> )
#xcommand ADO SQL CREATE <*cSQL*>   => ADOEXECUTE( 'CREATE '+ <(cSQL)> )
#xcommand ADO SQL DROP   <*cSQL*>   => ADOEXECUTE( 'DROP '  + <(cSQL)> )
#xcommand ADO SQL RENAME <*cSQL*>   => ADOEXECUTE( 'RENAME '+ <(cSQL)> )
#xcommand ADO SQL UPDATE <*cSQL*>   => ADOEXECUTE( 'UPDATE '+ <(cSQL)> )
#xcommand ADO SQL GRANT  <*cSQL*>   => ADOEXECUTE( 'GRANT ' + <(cSQL)> )
#xcommand ADO SQL REVOKE <*cSQL*>   => ADOEXECUTE( 'REVOKE '+ <(cSQL)> )

/*---- Lock Type Enum ----*/
#define adLockReadOnly        1
#define adLockPessimistic     2
#define adLockOptimistic      3
#define adLockBatchOptimistic 4

/*---- AllowNumsEnum ----*/
#define adIndexNullsAllow     0
#define adIndexNullsDisallow  1
#define adIndexNullsIgnore    2
#define adIndexNullsIgnoreAny 4

/*---- CursorTypeEnum Values ----*/
#define adOpenForwardOnly 0
#define adOpenKeyset 1
#define adOpenDynamic 2
#define adOpenStatic 3

/*---- LockTypeEnum Values ----*/
#define adLockReadOnly 1
#define adLockPessimistic 2
#define adLockOptimistic 3
#define adLockBatchOptimistic 4

/*---- CursorLocationEnum Values ----*/
#define adUseServer 2
#define adUseClient 3

/*---- DataTypeEnum Values ----*/
#define adEmpty 0
#define adTinyInt 16
#define adSmallInt 2
#define adInteger 3
#define adBigInt 20
#define adUnsignedTinyInt 17
#define adUnsignedSmallInt 18
#define adUnsignedInt 19
#define adUnsignedBigInt 21
#define adSingle 4
#define adDouble 5
#define adCurrency 6
#define adDecimal 14
#define adNumeric 131
#define adBoolean 11
#define adError 10
#define adUserDefined 132
#define adVariant 12
#define adIDispatch 9
#define adIUnknown 13
#define adGUID 72
#define adDate 7
#define adDBDate 133
#define adDBTime 134
#define adDBTimeStamp 135
#define adBSTR 8
#define adChar 129
#define adVarChar 200
#define adLongVarChar 201
#define adWChar 130
#define adVarWChar 202
#define adLongVarWChar 203
#define adBinary 128
#define adVarBinary 204
#define adLongVarBinary 205
#define adChapter 136
#define adFileTime 64
#define adPropVariant 138
#define adVarNumeric 139
#define adArray &H2000

/*---- GetRowsOptionEnum Values ----*/
#define adGetRowsRest -1

/*---- PositionEnum Values ----*/
#define adPosUnknown -1
#define adPosBOF -2
#define adPosEOF -3

/*---- BookmarkEnum Values ----*/
#define adBookmarkCurrent 0
#define adBookmarkFirst 1
#define adBookmarkLast 2

/*---- MarshalOptionsEnum Values ----*/
#define adMarshalAll 0
#define adMarshalModifiedOnly 1

/*---- AffectEnum Values ----*/
#define adAffectCurrent 1
#define adAffectGroup 2
#define adAffectAllChapters 4

/*---- ResyncEnum Values ----*/
#define adResyncUnderlyingValues 1
#define adResyncAllValues 2

/*---- CompareEnum Values ----*/
#define adCompareLessThan 0
#define adCompareEqual 1
#define adCompareGreaterThan 2
#define adCompareNotEqual 3
#define adCompareNotComparable 4

/*---- FilterGroupEnum Values ----*/
#define adFilterNone 0
#define adFilterPendingRecords 1
#define adFilterAffectedRecords 2
#define adFilterFetchedRecords 3
#define adFilterConflictingRecords 5

/*---- SearchDirectionEnum Values ----*/
#define adSearchForward 1
#define adSearchBackward -1

/*---- PersistFormatEnum Values ----*/
#define adPersistADTG 0
#define adPersistXML 1

/*---- StringFormatEnum Values ----*/
#define adClipString 2

/*---- ConnectPromptEnum Values ----*/
#define adPromptAlways 1
#define adPromptComplete 2
#define adPromptCompleteRequired 3
#define adPromptNever 4

/*---- ConnectModeEnum Values ----*/
#define adModeUnknown 0
#define adModeRead 1
#define adModeWrite 2
#define adModeReadWrite 3
#define adModeShareDenyRead 4
#define adModeShareDenyWrite 8
#define adModeShareExclusive 12
#define adModeShareDenyNone 16

/*---- EventReasonEnum Values ----*/
#define adRsnAddNew 1
#define adRsnDelete 2
#define adRsnUpdate 3
#define adRsnUndoUpdate 4
#define adRsnUndoAddNew 5
#define adRsnUndoDelete 6
#define adRsnRequery 7
#define adRsnResynch 8
#define adRsnClose 9
#define adRsnMove 10
#define adRsnFirstChange 11
#define adRsnMoveFirst 12
#define adRsnMoveNext 13
#define adRsnMovePrevious 14
#define adRsnMoveLast 15

/*---- SchemaEnum Values ----*/
#define adSchemaProviderSpecific -1
#define adSchemaAsserts 0
#define adSchemaCatalogs 1
#define adSchemaCharacterSets 2
#define adSchemaCollations 3
#define adSchemaColumns 4
#define adSchemaCheckConstraints 5
#define adSchemaConstraintColumnUsage 6
#define adSchemaConstraintTableUsage 7
#define adSchemaKeyColumnUsage 8
#define adSchemaReferentialConstraints 9
#define adSchemaTableConstraints 10
#define adSchemaColumnsDomainUsage 11
#define adSchemaIndexes 12
#define adSchemaColumnPrivileges 13
#define adSchemaTablePrivileges 14
#define adSchemaUsagePrivileges 15
#define adSchemaProcedures 16
#define adSchemaSchemata 17
#define adSchemaSQLLanguages 18
#define adSchemaStatistics 19
#define adSchemaTables 20
#define adSchemaTranslations 21
#define adSchemaProviderTypes 22
#define adSchemaViews 23
#define adSchemaViewColumnUsage 24
#define adSchemaViewTableUsage 25
#define adSchemaProcedureParameters 26
#define adSchemaForeignKeys 27
#define adSchemaPrimaryKeys 28
#define adSchemaProcedureColumns 29
#define adSchemaDBInfoKeywords 30
#define adSchemaDBInfoLiterals 31
#define adSchemaCubes 32
#define adSchemaDimensions 33
#define adSchemaHierarchies 34
#define adSchemaLevels 35
#define adSchemaMeasures 36
#define adSchemaProperties 37
#define adSchemaMembers 38
#define adSchemaTrustees 39

/*---- FieldStatusEnum Values ----*/
#define adFieldOK 0
#define adFieldCantConvertValue 2
#define adFieldIsNull 3
#define adFieldTruncated 4
#define adFieldSignMismatch 5
#define adFieldDataOverflow 6
#define adFieldCantCreate 7
#define adFieldUnavailable 8
#define adFieldPermissionDenied 9
#define adFieldIntegrityViolation 10
#define adFieldSchemaViolation 11
#define adFieldBadStatus 12
#define adFieldDefault 13
#define adFieldIgnore 15
#define adFieldDoesNotExist 16
#define adFieldInvalidURL 17
#define adFieldResourceLocked 18
#define adFieldResourceExists 19
#define adFieldCannotComplete 20
#define adFieldVolumeNotFound 21
#define adFieldOutOfSpace 22
#define adFieldCannotDeleteSource 23
#define adFieldReadOnly 24
#define adFieldResourceOutOfScope 25
#define adFieldAlreadyExists 26
#define adFieldPendingInsert &H10000
#define adFieldPendingDelete &H20000
#define adFieldPendingChange &H40000
#define adFieldPendingUnknown &H80000
#define adFieldPendingUnknownDelete &H100000

/*---- SeekEnum Values ----*/
#define adSeekFirstEQ &H1
#define adSeekLastEQ &H2
#define adSeekAfterEQ &H4
#define adSeekAfter &H8
#define adSeekBeforeEQ &H10
#define adSeekBefore &H20

/*---- ADCPROP_UPDATECRITERIA_ENUM Values ----*/
#define adCriteriaKey 0
#define adCriteriaAllCols 1
#define adCriteriaUpdCols 2
#define adCriteriaTimeStamp 3

/*---- ADCPROP_ASYNCTHREADPRIORITY_ENUM Values ----*/
#define adPriorityLowest 1
#define adPriorityBelowNormal 2
#define adPriorityNormal 3
#define adPriorityAboveNormal 4
#define adPriorityHighest 5

/*---- ADCPROP_AUTORECALC_ENUM Values ----*/
#define adRecalcUpFront 0
#define adRecalcAlways 1

/*---- ADCPROP_UPDATERESYNC_ENUM Values ----*/

/*---- ADCPROP_UPDATERESYNC_ENUM Values ----*/

/*---- MoveRecordOptionsEnum Values ----*/
#define adMoveUnspecified -1
#define adMoveOverWrite 1
#define adMoveDontUpdateLinks 2
#define adMoveAllowEmulation 4

/*---- CopyRecordOptionsEnum Values ----*/
#define adCopyUnspecified -1
#define adCopyOverWrite 1
#define adCopyAllowEmulation 4
#define adCopyNonRecursive 2

/*---- StreamTypeEnum Values ----*/
#define adTypeBinary 1
#define adTypeText 2

/*---- LineSeparatorEnum Values ----*/
#define adLF 10
#define adCR 13
#define adCRLF -1

/*---- StreamOpenOptionsEnum Values ----*/
#define adOpenStreamUnspecified -1
#define adOpenStreamAsync 1
#define adOpenStreamFromRecord 4

/*---- StreamWriteEnum Values ----*/
#define adWriteChar 0
#define adWriteLine 1

/*---- SaveOptionsEnum Values ----*/
#define adSaveCreateNotExist 1
#define adSaveCreateOverWrite 2

/*---- FieldEnum Values ----*/
#define adDefaultStream -1
#define adRecordURL -2

/*---- StreamReadEnum Values ----*/
#define adReadAll -1
#define adReadLine -2

/*---- RecordTypeEnum Values ----*/
#define adSimpleRecord 0
#define adCollectionRecord 1
#define adStructDoc 2


Codigo Fonte Adoxb.prg

****************************************************************************************
*
* CursorType
*
* adOpenForwardOnly     0 O cursor so navega para frente. Bom para listar dados
* adOpenKeyset          1 Nao permite ver os registro adicionados e eliminados
* adOpenDynamic         2 Aceita todas operacoes do utilizador e dos outros
* adOpenStatic          3 Serve apenas para procurar dados ou gerar relatorios
*
* LockTypeEnum - Contantes de Seguranca
*
* adLockReadOnly        1 Apenas pode ler os registros
* adLockPessimistic     2 O fornecedor dos dados fecha o registro apos edicao
* adLockOptimistic      3 O fornecedor dos dados fecha o registro apos chamar o update
* adLockBatchOptimistic 4 O mesmo que Optmistic mas para sequencia de comandos
*
* SortOrdEnum - Contantes de Ordenacao
*
* adSortAscending       1 Ordem ascendente
* adSortDescending      2 Ordem descendente
*
****************************************************************************************

#include "adoxb.ch"
#ifndef _ADO_xHarbour_
        #define _ADO_Harbour_
#endif

*
*---------------------------------------------------------
Function ADOSetRDD( cRDDName )
   public cADORDD := iif( cRDDName=NIL, "DBF", cRDDName )
   PUBLIC aRecordSet, oRecordSet, nConnection, nRecordSet, aIndexOrder, nIndexOrder, ;
          StrConnection, aADOConection, oADOConection, oADOErrDescription, oADOIndex, ;
          oADOCatalog, oADOTable, oADOStream
   nConnection        := 1
   aADOConection      := {}
   oADOConection      := Array(10)
   return cADORDD

*
*---------------------------------------------------------
#ifdef _ADO_Harbour_
Function ADOConnect( StrDriver )
   //PUBLIC aRecordSet, oRecordSet, nRecordSet, aIndexOrder, nIndexOrder, StrConnection, oADOConection, oADOErrDescription, oADOIndex, oADOCatalog, oADOTable
   aRecordSet         := {}
   oRecordSet         := Array(50)
   oADOIndex          := Array(10)
   nRecordSet         := 0
   aIndexOrder        := {}
   nIndexOrder        := 1
   StrConnection      := StrDriver
   AADD( aADOConection, StrDriver ) // Controla numero de conexoes
   nConnection        := len( aADOConection )
   oADOConection[nConnection] := TOLEAUTO():New("ADODB.connection")
   oADOStream         := TOLEAUTO():New("ADODB.Stream")
   oADOErrDescription := TOLEAUTO():New("ADODB.Err")
   oADOIndex          := TOLEAUTO():New("ADOX.Index")
   oADOCatalog        := TOLEAUTO():New("ADOX.Catalog")
   oADOConection[nConnection]:CommandTimeOut    := 200
   oADOConection[nConnection]:ConnectionTimeOut := 10
   oADOConection[nConnection]:CursorLocation    := adUseClient
   oADOConection[nConnection]:Mode              := adModeShareDenyNone // adModeRead 1, adModeWrite 2, adModeReadWrite 3
   oADOConection[nConnection]:Open( StrConnection )
   return 'connected'
   #endif _ADO_Harbour_

*
*---------------------------------------------------------
#ifdef _ADO_Harbour_
Function ADODBCREATE( cDatabase )
   oADOCreateCatalog := TOLEAUTO():New("ADOX.Catalog")
   StrConnection := "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + cDatabase
   oADOCreateCatalog:Create( StrConnection )
   return .t.

Function ADOCREATE( cTable, aFields )
   //local oADOTable := TOLEAUTO():New("ADOX.Table")
   //oADOCatalog:ActiveConnection := StrConnection
   //oADOTable:Name := cTable
   //for i = 1 to len( aFields )
   //    oADOTable:Columns:Append( aFields[i][1], GetFieldType(aFields[i][2]), aFields[i][3] )
   //next
   //oADOCatalog:Tables:Append( oADOTable )
   //oADOTable:Close()
   //oADOTable:End()
   //
   //oADOCreateCatalog := TOLEAUTO():New("ADOX.Catalog")
   //oADOCreateTable   := TOLEAUTO():New("ADOX.Table")
   //oADOCreateCatalog:Create( StrConnection )
   //oADOCreateTable:Name := cTable
   //for i = 1 to len( aFields )
   //    oADOCreateTable:Columns:Append( aFields[i][1], GetFieldType(aFields[i][2]) ) //, aFields[i][3] )
   //next
   //oADOCreateCatalog:Tables:Append( cTable )
   //return .t.
   #endif _ADO_Harbour_

*
*---------------------------------------------------------
#ifdef _ADO_Harbour_
Function ADOIndex( cTable, cIDXField, cIDXName, cIDXAscend )
   local adSortAscending := 1, adSortDescending := 2
   local oADOTable := TOLEAUTO():New("ADOX.Table")
   cIDXAscend := iif( cIDXAscend = nil, .t., cIDXAscend )
   if .not. ADOFILE( "INDEXES" )
      oADOCatalog:ActiveConnection := StrConnection
      oADOTable:Name := "INDEXES"
      oADOTable:Columns:Append( "NumField", adInteger, 20 )
      oADOTable:Columns:Append( "TextField", adVarWChar, 20 )
      oADOCatalog:Tables:Append( oADOTable )
   endif
   AADD( aIndexOrder, cTable )
   nIndexOrder        := len( aIndexOrder )
   oADOIndex[nIndexOrder] := TOLEAUTO():New("ADOX.Index")
   oADOIndex[nIndexOrder]:Name       := cIDXName
   oADOIndex[nIndexOrder]:Columns:Append( cIDXField )
   oADOIndex[nIndexOrder]:Columns( cIDXField ):SortOrder = iif( cIDXAscend, adSortAscending, adSortDescending )
   //oADOIndex[nIndexOrder]:PrimaryKey := .t.
   //oADOIndex[nIndexOrder]:Unique     := .t.
   oADOIndex[nIndexOrder]:IndexNulls := adIndexNullsAllow
   // Adciona o indice criado ao catalogo
   //oADOCatalog:Tables( cTable ) //:Indexes:Append( oADOIndex[nIndexOrder] )
   oADOTable:Indexes:Append( oADOIndex )
   oADOCatalog:Tables:Append( oADOTable )
   oADOTable:Close()
   oADOTable:End()
   return .t.
   #endif _ADO_Harbour_

*
*---------------------------------------------------------
#ifdef _ADO_Harbour_
Function ADOUse( cDatabase, lShared )
   local oError
   if cADORDD = "XML"
      cDatabase := cDatabase + ".xml"
   endif
   if cADORDD = "XLS"
      cDatabase := "[" + cDatabase + "$]"
   endif
   if cDatabase = NIL
      oRecordSet[nRecordSet]:Close()
      oRecordSet[nRecordSet]:End()
   else
      AADD( aRecordSet, cDatabase )
      cRecordSet := cDatabase
      nRecordSet := len( aRecordSet )
      oRecordSet[nRecordSet] := TOleAuto():New( "ADODB.Recordset" )
      if cADORDD = "XML"
         oRecordSet[nRecordSet]:Open( cDatabase, StrConnection, 1, 3 )
      else
         oRecordSet[nRecordSet]:CacheSize      := 50
         oRecordSet[nRecordSet]:CursorLocation := adUseClient
         if lShared = .t.
            oRecordSet[nRecordSet]:CursorType  := adOpenDynamic
            oRecordSet[nRecordSet]:LockType    := adLockOptimistic
         else
            oRecordSet[nRecordSet]:CursorType  := adOpenStatic
            oRecordSet[nRecordSet]:LockType    := adLockPessimistic
         endif
         oRecordSet[nRecordSet]:Open( "Select * from " + cDatabase, StrConnection, iif(lShared=.t.,3,1), 3 )
      endif
      ADOGOTOP() // oRecordSet[nRecordSet]:MoveFirst()
   endif
   * CursorType
   *
   * adOpenForwardOnly     0 O cursor so navega para frente. Bom para listar dados
   * adOpenKeyset          1 Nao permite ver os registro adicionados e eliminados
   * adOpenDynamic         2 Aceita todas operacoes do utilizador e dos outros
   * adOpenStatic          3 Serve apenas para procurar dados ou gerar relatorios
   *
   * LockTypeEnum - Contantes de Seguranca
   *
   * adLockReadOnly        1 Apenas pode ler os registros
   * adLockPessimistic     2 O fornecedor dos dados fecha o registro apos edicao
   * adLockOptimistic      3 O fornecedor dos dados fecha o registro apos chamar o update
   * adLockBatchOptimistic 4 O mesmo que Optmistic mas para sequencia de comandos
   return .t.
   #endif _ADO_Harbour_

*
*---------------------------------------------------------
#ifdef _ADO_Harbour_
Function ADOConnectRemote( StrDSN, StrServer )
   PUBLIC aRecordSet, oRecordSet, nRecordSet, aIndexOrder, nIndexOrder, StrConnection, oADOConection, oADOErrDescription, oADOIndex, oADOCatalog
   aRecordSet    := {}
   oRecordSet    := Array(50)
   oADOIndex     := Array(10)
   nRecordSet    := 0
   aIndexOrder   := {}
   nIndexOrder   := 1
   StrConnection := StrDriver
   oADOConection := TOLEAUTO():New("RDS.DataControl")
   oADOConection:ExecuteOptions := adcExecAsync
   oADOConection:Connect        := "DSN=" + StrDriver
   oADOConection:Server         := StrServer
   oADOConection:Refresh()
   return .t.
   #endif _ADO_Harbour_

*
*---------------------------------------------------------
Function ADOConnected()
   if !(valtype(oADOConection[nConnection]) = "O")
      return .f. // Nao foi definido o Objecto
   endif
   if valtype(oADOConection) = "L"
      return .f. // Se ja existe a variavel mas nao foi definida como Objeto
   endif
   cADOConectionState := oADOConection[nConnection]:State
   return iif( cADOConectionState=1, .t., .f. )

*
*---------------------------------------------------------
Function MsgAlert( cMsg )
   Alert( cMsg )
   return .t.

*
*---------------------------------------------------------
Function ADOSetDriver( StrDatabase, StrSenha, StrUsuario, StrServer, StrPort )
   public cADORDD := iif( cRDDName=NIL, "DBASE", cRDDName )
   StrConnection := ""
   StrDriver     := ADORDDDefault()
   if StrDriver = "DBASE"
      StrConnection := "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+StrDatabase+";Extended Properties=dBASE IV;"
   endif
   if StrDriver = "ACCESS" // ADOMDB
      StrConnection := "Provider= MicroSoft.Jet.OLEDB.4.0;Data Source="+StrDatabase+";"
   endif
   if StrDriver = "FIREBIRD" // ADOGDB
      StrConnection := "DRIVER=Firebird/InterBase(r) driver; UID="+StrSenha+"; PWD="+StrUsuario+"; DBNAME="+StrDatabase
   endif
   if StrDriver = "MYSQL" // ADOMySQL
      StrConnection := "driver={MySQL ODBC 3.51 Driver};database=" + StrDatabase + ;
                       ";server=" + StrServer + ;
                       ";uid=" + StrUsuario + ;
                       ";pwd=" + StrSenha + ;
                       ";option=35"
   endif
   if StrDriver = "PARADOX" // ADOPX
      StrConnection := "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+StrDatabase+";Extended Properties=Paradox 5.x;"
   endif
   if StrDriver = "SQL"
      StrConnection := "Provider=MSDASQL;Data Source=SQLExpress;User ID=Administrador;Password=konectiva;"
   endif
    if ADORDDDefault() = "XMLDB" // ADOXML
       StrConnection := "Provider=MSPersist"
    endif
    if ADORDDDefault() = "XML" // ADOXML
       StrConnection := "Provider=MSDAOSP;Data Source=MSXML2.DSOControl.2.6"
    endif
   if StrDriver = "XLS" // ADOXLS
      StrConnection := [Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\adoxls.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"]
   endif
   if StrDriver = "REMOTE" // ADORDS
      StrConnection := "Provider=MS Remote;Remote Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+StrDatabase+";Remote Server=" + StrServer
   endif
   return StrConnection

*
*---------------------------------------------------------
Function ADORDDDefault(qADORDD)
   default cADORDD := "Nenhum RDD especificado."
   //if (qADORDD = nil)
   //   cADORDD := qADORDD
   //endif
   return cADORDD

*
*---------------------------------------------------------
Function ADOFile( cFile )
   if cADORDD = "XML" .or. cADORDD = "XLS"
      return file( cFile )
   else
      oADOCatalog := oADOConection[nConnection]:OpenSchema(adSchemaTables)
      do while .not. oADOCatalog:EOF()
         if upper(alltrim(oADOCatalog:Fields( "TABLE_NAME" ):Value)) = upper(alltrim(cFile))
            return .t.
         endif
         oADOCatalog:MoveNext()
      enddo
   endif
   return .f.

*
*---------------------------------------------------------
Function ADOAlias()
   if nRecordSet < 1
      return ""
   else
      return aRecordSet[nRecordSet]
   endif

*
*---------------------------------------------------------
Function ADOFCount()
   if nRecordSet < 1
      return ""
   else
      return aRecordSet[nRecordSet]:Fields:Count()
   endif

*
*---------------------------------------------------------
Function ADOBEGINTRANSACTION()
   oADOConection[nConnection]:BeginTrans()
   return .t.

*
*---------------------------------------------------------
Function ADOCOMMITTRANSACTION()
   oADOConection[nConnection]:CommitTrans()
   return .t.

*
*---------------------------------------------------------
Function GetFieldType(FieldType)
   do Case
      Case FieldType = "C"
           return adVarWChar
      Case FieldType = "N"
           return adInteger
      Case FieldType = "M"
           return adText
      Case FieldType = "L"
           return adBoolean
      Case FieldType = "D"
           return adDate
   Endcase

*
*---------------------------------------------------------
Function ADOSetOrder( nIDXOrder )
   oRecordSet[nRecordSet]:Index = oADOIndex[nIDXOrder]:Name
   return .t.

*
*---------------------------------------------------------
Function ADODISConnect()
   oADOConection[nConnection]:Close()
   oADOErrDescription:Close()
   oADOIndex:Close()
   oADOCatalog:Close()
   oADOConection[nConnection]:End()
   oADOErrDescription:End()
   oADOIndex:End()
   oADOCatalog:End()
   return .t.

*
*---------------------------------------------------------
Function ADOAppend()
   oRecordSet[nRecordSet]:AddNew()
   return .t.

*
*---------------------------------------------------------
Function ADOEdit()
   oRecordSet[nRecordSet]:Edit()
   return .t.

*
*---------------------------------------------------------
Function ADOCommit( lSave )
   lSave := iif( lSave = nil, .f., lSave )
   oRecordSet[nRecordSet]:Update()
   if lSave
      oRecordSet[nRecordSet]:Save( alltrim(aRecordSet[nRecordSet]), adPersistXML )
   endif
   marca := oRecordSet[nRecordSet]:BookMark
   oRecordSet[nRecordSet]:Requery()
   oRecordSet[nRecordSet]:BookMark = marca
   return .t.

*
*---------------------------------------------------------
Function ADORequery()
   oRecordSet[nRecordSet]:Requery()
   return .t.

*
*---------------------------------------------------------
Function ADOReSync()
   oRecordSet[nRecordSet]:ReSync()
   return .t.

*
*---------------------------------------------------------
Function ADOUpdateBatch()
   oRecordSet[nRecordSet]:UpdateBatch()
   return .t.

*
*---------------------------------------------------------
Function ADOCommitAll()
   for i = 1 to len(aRecordSet)
       oRecordSet[nRecordSet]:Update()
   next
   return .t.

*
*---------------------------------------------------------
Function ADOSave( cfile )
   oRecordSet[nRecordSet]:Save( cFile, adPersistXML )
   return .t.

*
*---------------------------------------------------------
Function ADOReglock()
   //oRecordSet[nRecordSet]:CursorLocation := 2
   //oRecordSet[nRecordSet]:CursorType     := 0
   //oRecordSet[nRecordSet]:LockType       := 3
   return .t.

*
*---------------------------------------------------------
Function ADOSkip( nSkip )
   LOCAL nRec := oRecordSet[nRecordSet]:AbsolutePosition()
   oRecordSet[nRecordSet]:Move( iif( nSkip = nil, 1, nSkip ) )
   IF oRecordSet[nRecordSet]:EOF(); oRecordSet[nRecordSet]:MoveLast() ; ENDIF
   IF oRecordSet[nRecordSet]:BOF(); oRecordSet[nRecordSet]:MoveFirst(); ENDIF
   return oRecordSet[nRecordSet]:AbsolutePosition() - nRec

*
*---------------------------------------------------------
Function ADODelete()
   oRecordSet[nRecordSet]:Delete()
   oRecordSet[nRecordSet]:Move( -1 )
   if cADORDD = "XML" // ".XML" $ upper(aRecordSet[nRecordSet])
      oRecordSet[nRecordSet]:Save( alltrim(aRecordSet[nRecordSet]), adPersistXML )
   endif
   return .t.

*
*---------------------------------------------------------
Function ADOGoTo( nRec )
   //oRecordSet[nRecordSet]:BookMark :=  nRec
   return .t.

*
*---------------------------------------------------------
Function ADOGoTop()
   if .not. ADOBof()
      if ADORecCount() > 0
         oRecordSet[nRecordSet]:MoveFirst()
      endif
   endif
   return .t.

*
*---------------------------------------------------------
Function ADOGoBottom()
   if .not. ADOEof()
      if ADORecCount() > 0
         oRecordSet[nRecordSet]:MoveLast()
      endif
   endif
   return .t.

*
*---------------------------------------------------------
Function ADORecno()
   if nRecordSet < 0
      return 0
   else
      return oRecordSet[nRecordSet]:AbsolutePosition()
   endif

*
*---------------------------------------------------------
Function ADORecCount()
   if nRecordSet < 1
      return 0
   else
      nRecord := oRecordSet[nRecordSet]:AbsolutePosition()
      nRecord := iif(nRecord=nil,-1,nRecord)
      if nRecord < 1 //.or. .not. ( oRecordSet[nRecordSet]:EOF() = oRecordSet[nRecordSet]:BOF() )
         return 0
      else
         return oRecordSet[nRecordSet]:RecordCount()
      endif
   endif

*
*---------------------------------------------------------
Function ADOSetFilter( xpr )
   if xpr = NIL
      oRecordSet[nRecordSet]:Filter := 0
   else
      oRecordSet[nRecordSet]:Filter := xpr
   endif
   return .t.

*
*---------------------------------------------------------
Function ADODeleted( criterio )
   if oRecordSet[nRecordSet]:Status = adRecDeleted
      return .t.
   endif
   return .f.

*
*---------------------------------------------------------
Function ADOClose()
   _RecordSet := len( aRecordSet )
   ADEL( aRecordSet, nRecordSet )
   ASIZE( aRecordSet, _RecordSet-1 )
   oRecordSet[nRecordSet]:End()
   return .t.

*
*---------------------------------------------------------
Function ADOCloseAll()
   for i = 1 to len(aRecordSet)
       oRecordSet[nRecordSet]:End()
   next
   aRecordSet := {}
   nRecordSet := 0
   return .t.

*
*---------------------------------------------------------
Function ADOExecute( cSql )
   aADODefines := {}
   AADD( aADODefines, { "VOID("   , "0(" } )
   AADD( aADODefines, { "BYTE("   , "1(" } )
   AADD( aADODefines, { "CHAR("   , "2(" } )
   AADD( aADODefines, { "WORD("   , "3(" } )
   AADD( aADODefines, { "INT("    , "7(" } )
   AADD( aADODefines, { "BOOLEAN(", "5(" } )
   AADD( aADODefines, { "HDC("    , "6(" } )
   AADD( aADODefines, { "LONG("   , "7(" } )
   AADD( aADODefines, { "STRING(" , "8(" } )
   AADD( aADODefines, { "LPSTR("  , "9(" } )
   AADD( aADODefines, { "PTR("    ,"10(" } )
   AADD( aADODefines, { "DOUBLE(" ,"11(" } )
   AADD( aADODefines, { "DWORD("  ,"12(" } )
   for i = 1 to len( aADODefines )
       cSql := StrTran( cSql, aADODefines[i][2], aADODefines[i][1] )
   next
   //adolog( cSql )
   oADOConection[nConnection]:Execute( cSql )
   return .t.

Function ADOInsertInto( cSql )
   cSql := StrTran( cSql, '"', "'" )
   cSql := "INSERT INTO " + cSql
//? cSql
   oADOConection[nConnection]:Execute( cSql )
   return .t.

*
*---------------------------------------------------------
Function ADOBOF()
   return iif( ADORecCount() > 0, oRecordSet[nRecordSet]:Bof, .t. )

*
*---------------------------------------------------------
Function ADOEOF()
   return iif( ADORecCount() > 0, oRecordSet[nRecordSet]:Eof, .t. )

*
*---------------------------------------------------------
Function ADOFOUND()
   return !oRecordSet[nRecordSet]:Eof

*
*---------------------------------------------------------
Function ADOFind( criterio )
   ADOLocate( criterio )
   return .t.

*
*---------------------------------------------------------
Function ADOLocate( criterio )
   local _nBookMark := oRecordSet[nRecordSet]:Bookmark
   oRecordSet[nRecordSet]:MoveFirst()
   oRecordSet[nRecordSet]:Find( criterio )
   if oRecordSet[nRecordSet]:Eof()
      oRecordSet[nRecordSet]:BookMark := _nBookmark
      return .f.
   else
      return .t.
   endif

*
*---------------------------------------------------------
Function ADOSort( cField, nModo )
   if valtype(cField)='N'
      cField := oRecordSet[nRecordSet]:Fields( cStrField ):Name
   endi
   if cField = Nil
      Return upper(oRecordSet[nRecordSet]:Sort)
   else
      oRecordSet[nRecordSet]:Sort := cField + iif( nModo = NIL, " ASC", " DESC" )
      oRecordSet[nRecordSet]:MoveFirst()
   endif
   return .t.

*
*---------------------------------------------------------
Function ADOFiles( cTable )
   return iif(oRecordSet[nRecordSet]:Table(cTable)==cTable,.t.,.f.)

*
*---------------------------------------------------------
Function ADOAREAS()
   return nRecordSet

*
*---------------------------------------------------------
Function ADOSelect( cRecordSet )
   if cRecordSet = nil
   else
      if cADORDD = "XLS"
         cRecordSet := "[" + cRecordSet + "$]"
      endif
      nRecordSet := ASCAN( aRecordSet, cRecordSet ) 
      nRecordSet := iif( nRecordSet = 0, 1, nRecordSet )
   endif
   //ADOGotop()
   return nRecordSet

*
*---------------------------------------------------------
Function ADOLOG( cMensagem )
   local nHandle
   if .not. file( "ADOERRO.TXT" )
      nHandle := fcreate("ADOERRO.TXT",0)
   else
      nHandle := fopen("ADOERRO.TXT",1)
      length  := fseek(nHandle,0,2)
      fseek(nHandle,length)
   endif
   fwrite(nHandle, cMensagem )
   fclose(nHandle)
   return NIL

*
*---------------------------------------------------------
Function ADOReplace( cCampo, xDado )
   LOCAL uVal,xValor,nTipo,cType,nLong,cQuery,lRepassa := .f., lBlob := .f.,;
         StrFileName
   uVal  := oRecordSet[nRecordSet]:Fields( cCampo ):Value
   nTipo := oRecordSet[nRecordSet]:Fields( cCampo ):Type
   cType := TypeDat(nTipo,cCampo)
   nLong := oRecordSet[nRecordSet]:Fields( cCampo ):DefinedSize
   if ! Empty( xDado )
      if ValType( xDado ) = 'D'
         if nTipo=  7 .or. nTipo=133 .or. nTipo=135
            if empty( xDado )
               xDado := date()
            endif
            lRepassa := .t.
         endif
      endif
      if ValType( xDado ) = 'N'
         if nTipo=17 .or. nTipo= 14 .or. nTipo=  5 .or. nTipo=  3 .or. nTipo=131 .or. nTipo=  2 .or. nTipo=  6 .or. ;
            nTipo= 4 .or. nTipo=020 .or. nTipo=018 .or. nTipo=019 .or. nTipo= 21 .or. nTipo=138 .or. nTipo=139
            lRepassa := .t.
         endif
      endif
      if ValType( xDado ) = 'C'
         if nTipo=202 .or. nTipo=130 .or. nTipo=200 .or. nTipo=201 .or. nTipo=129 .or. nTipo= 72
            xDado := substr( xDado, 1, nLong )
            lRepassa := .t.
         endif
         if nTipo=201 .or. nTipo=203 .or. nTipo=205 .or. nTipo=128
            StrFileName := Alltrim(StrZero(Random(99999999),8))+".APL"
            MemoWrit( StrFileName, xDado )
            lRepassa := .t.
            lBlob    := .t.
         endif
      endif
      if ValType( xDado ) = 'L'
         if nTipo= 11 .or. nTipo= 16
            lRepassa := .t.
         endif
      endif
      if ValType( xDado ) = 'M' .or. ValType( xDado ) = 'I'
         if nTipo=201 .or. nTipo=203 .or. nTipo=205 .or. nTipo=128
            lRepassa := .t.
            lBlob    := .t.
         endif
      endif
      if lRepassa
         if lBlob // adolog( ccampo+"-"+ctype+"-"+strzero(ntipo,3)+"-"+ValType( xDado ) )
            oADOStream:Type := 1 // adTypeBinary
            oADOStream:Open()
            oADOStream:LoadFromFile( StrFileName )
            oRecordSet[nRecordSet]:Fields( cCampo ):Value := oADOStream:Read()
            oADOStream:Close()
         else
            oRecordSet[nRecordSet]:Fields( cCampo ):Value := xDado
         endif
      endif
   endif
   return .t.

*
*---------------------------------------------------------
Function ADOField( cStrField )
   LOCAL uVal,nTipo,cType,nLong,xValor:=nil,StrFileName
   if valtype(cStrField)='C'
      cStrField := upper(alltrim(cStrField))
   endif
   if nRecordSet > 0
      uVal  := oRecordSet[nRecordSet]:Fields( cStrField ):Value
      nTipo := oRecordSet[nRecordSet]:Fields( cStrField ):Type
      cType := TypeDat(nTipo,cStrField)
      nLong := oRecordSet[nRecordSet]:Fields( cStrField ):DefinedSize
      do case
         case cType='C'; xValor:=if(empty(uVal),spac(nLong),uVal+spac(nLong-len(uVal)))
         case cType='D'; xValor:=if(empty(uVal),ctod('')                    ,uVal)
         case cType='N'; xValor:=if(empty(uVal),0                           ,uVal)
         case cType='L'; xValor:=if(empty(uVal),.f.                         ,uVal)
         case cType='M' .or. cType='I'
              StrFileName := Alltrim(StrZero(Random(99999999),8))+".APL"
              oADOStream:Type := 1 // adTypeBinary
              oADOStream:Open()
              oADOStream:Write( oRecordSet[nRecordSet]:Fields( cStrField ) )
              oADOStream:LoadFromFile( oRecordSet[nRecordSet]:Fields( StrFileName ), 2 ) // adSaveCreateOverWrite
              oADOStream:Close()
              xValor := MemoRead( StrFileName )
         otherwise     ; xValor:=         uVal
      endcase
   endif
   RETURN xValor

*
*---------------------------------------------------------
Function ADOFieldBlank( cStrField )
   LOCAL uVal,nTipo,cType,nLong,xValor:=nil
   if valtype(cStrField)='C'
      cStrField := upper(alltrim(cStrField))
   endif
   if nRecordSet > 0
      uVal  := oRecordSet[nRecordSet]:Fields( cStrField ):Value
      nTipo := oRecordSet[nRecordSet]:Fields( cStrField ):Type
      cType := TypeDat(nTipo,cStrField)
      nLong := oRecordSet[nRecordSet]:Fields( cStrField ):DefinedSize
      do case
         case cType='C'; xValor:=space(nLong)
         case cType='D'; xValor:=ctod('  /  /  ')
         case cType='N'; xValor:=0
         case cType='L'; xValor:=.f.
         otherwise     ; xValor:=''
      endcase
   endif
   RETURN xValor

*
*---------------------------------------------------------
Function TypeDat(nTipo,cField)
   do case
      case nTipo=8.or.nTipo=12.or.nTipo=72.or.nTipo=129.or.nTipo=130.or.(nTipo>=200.and.nTipo<=203)
           // adBSTR             8
           // adGUID             72
           // adChar             129
           // adWChar            130
           // adVarChar          200
           // adLongVarChar      201
           // adVarWChar         202
           // adLongVarWChar     203
           return 'C'

      case nTipo= 17.or.nTipo= 16.or.nTipo= 14.or.nTipo=  5.or.nTipo=  3.or.nTipo=131.or.nTipo= 2 .or.nTipo=  6.or.;
           nTipo=  4.or.nTipo=020.or.nTipo=018.or.nTipo=019.or.nTipo= 21.or.nTipo=138.or.nTipo=139
           // adSmallInt         2
           // adInteger          3
           // adSingle           4
           // adDouble           5
           // adCurrency         6
           // adDecimal          14
           // adTinyInt          16
           // adUnsignedTinyInt  17
           // adUnsignedSmallInt 18
           // adUnsignedInt      19
           // adBigInt           20
           // adUnsignedBigInt   21
           // adNumeric          131
           // adPropVariant      138
           // adVarNumeric       139
           return 'N' // Numerico

      case nTipo=  7.or.nTipo=64.or.nTipo=133.or.nTipo=134.or.nTipo=135
           // adDate             7
           // adFileTime         64
           // adDBDate           133
           // adDBTime           134
           // adDBTimeStamp      135
           return 'D' // Data

      case nTipo= 11
           // adBoolean          11
           return 'L' // Logico

      case nTipo=203.or.nTipo=128
           // adLongVarWChar     203
           // adPropVariant      138
           return 'M' // Memo

      case nTipo=128.or.nTipo=204.or.nTipo=205
           // adBinary           128
           // adVarBinary        204
           // adLongVarBinary    205
           return 'I' // Imagem

   otherwise
      alert('Tipo de dado invalido: Campo '+cField+' Type='+str(nTipo))
   endcase
   return 'U'

*
*---------------------------------------------------------
Function isRSEmpty()
   return ((oRecordSet[nRecordSet]:BOF()=.t.) .and. (oRecordSet[nRecordSet]:EOF()=.t.))

*
*---------------------------------------------------------
Function ADOGetSQL( sqlFileName )
   sqlFileName = sqlFileName + ".SQL"
   if file(sqlFileName)
      cSql := MemoRead( sqlFileName )
      oADOConection:Execute( cSql )
   endif
   return nil

*
*---------------------------------------------------------
Function ADOUseRemote( cDatabase, lShared )
   local oError
   if cDatabase = NIL
      oRecordSet[nRecordSet]:Close()
   else
      AADD( aRecordSet, cDatabase )
      cRecordSet := cDatabase
      nRecordSet := len( aRecordSet )
      oRecordSet[nRecordSet] := oADOConection
      if cADORDD = "XML" // ".XML" $ upper(cDatabase)
         oRecordSet[nRecordSet]:Open( cDatabase, StrConnection, 1, 3 )
      else
         oRecordSet[nRecordSet]:CacheSize      := 50
         oRecordSet[nRecordSet]:CursorLocation := adUseClient
         if lShared = .t.
            oRecordSet[nRecordSet]:CursorType  := 1 // adOpenKeySet
            oRecordSet[nRecordSet]:LockType    := adLockBatchOptimistic
         else
            oRecordSet[nRecordSet]:CursorType  := adOpenStatic
            oRecordSet[nRecordSet]:LockType    := adLockPessimistic
         endif
         oRecordSet[nRecordSet]:Sql( "Select * from " + cDatabase, StrConnection )
      endif
      oRecordSet[nRecordSet]:MoveFirst()
   endif
   return .t.

function Random( nMaximo )
   static nRandom
   local nTemporal
   nMaximo = if( nMaximo == NIL, 65535, nMaximo )
   if nRandom == NIL
      nRandom = seconds()
   endif
   nTemporal = ( nRandom * seconds() ) % ( nMaximo + 1 )
   nRandom = nTemporal + seconds()
   RETURN int( nTemporal )


Aplicativo de Teste Customers.prg

#include "FiveWin.ch"
#include "Splitter.ch"

#include "adoxb.ch"

static oWnd, oClients, oClient, oName
static cName
static oSplit

//----------------------------------------------------------------------------//
function CUSTOMER(cTitle)
    public oMenu, user_nivel := 5
    default cTitle := "coloque um nome"

    // Necessária para criar objetos e variaveis visiveis o tempo todo
    ADOSetRDD( "ACCESS" )

    if ADORDDDefault() = "ACCESS" // ADOMDB
       StrDatabase   := ".\adomdb.mdb"
       StrConnection := "Provider= MicroSoft.Jet.OLEDB.4.0;Data Source="+StrDatabase+";"
    endif
    if ADORDDDefault() = "FIREBIRD" // ADOGDB
       StrDatabase   := ".\adogdb.gdb"
       StrConnection := "DRIVER=Firebird/InterBase(r) driver; UID=sysdba; PWD=masterkey; DBNAME="+StrDatabase
    endif
    if ADORDDDefault() = "MYSQL" // ADOMySQL
       StrDatabase   := [adomysql]
       StrServer     := [127.0.0.1]
       StrPort       := 3306
       StrUserID     := [root]
       StrUserPWD    := []
       StrDriver     := "MySQL ODBC 3.51 Driver"
       StrConnection := "driver={" + StrDriver +"};database=" + StrDatabase + ;
                        ";server=" + StrServer + ;
                        ";uid=" + StrUserID + ;
                        ";pwd=" + StrUserPWD + ;
                        ";option=35"
    endif
    if ADORDDDefault() = "PARADOX" // ADOPX
       StrConnection := "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\;Extended Properties=Paradox 5.x;"
    endif
    if ADORDDDefault() = "XML" // ADOXML
       StrConnection := "Provider=MSPersist"
    endif
    if ADORDDDefault() = "REMOTE" // ADORDS
       StrConnection := "Provider=MS Remote;Remote Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/Inetpub/wwwroot/scripts/ASP/UAPortal/ua_portal.mdb;Remote Server=http://localhost/uaportal/"
    endif

    MsgRun( "Conectando via "+ADORDDDefault()+"..." )

    ADO CONNECT StrConnection

    // Cria tabelas se nao existirem
    if ADOFile( "clientes" )
    else 
       MsgRun( "Criando tabela CLIENTES..." )
       ADO EXECUTE "DROP TABLE clientes"
       ADO EXECUTE "CREATE TABLE clientes (nome char(45), email char(45), unique(nome))"
    endif
    if ADOFile( "siglas" )
    else
       MsgRun( "Criando tabela SIGLAS..." )
       ADO EXECUTE "DROP TABLE siglas"
       ADO EXECUTE "CREATE TABLE siglas (uf char(2), estado char(20), unique(uf))"
    endif

    // Abre as tabelas
    ADO USE clientes
    ADO USE siglas

    // Verifica se ja possuem dados
    ADO SELECT clientes
    nRegistros := ADORecCount()
    if nRegistros = 0
       ADO APPEND BLANK
       ADO REPLACE nome        WITH "JOSE CARLOS DA ROCHA"
       ADO REPLACE email       WITH "IROCHINHA@ITELEFONICA.COM.BR"
       ADO COMMIT
    endif

    ADO SELECT siglas
    nRegistros := ADORecCount()
    if nRegistros = 0
       ADO APPEND BLANK
       ADO REPLACE uf          WITH "SP"
       ADO REPLACE estado      WITH "SAO PAULO"
       ADO COMMIT
       ADO APPEND BLANK
       ADO REPLACE uf          WITH "RJ"
       ADO REPLACE estado      WITH "RIO DE JANEIRO"
       ADO COMMIT
    endif

    ADO CLOSE ALL

    SET _3DLOOK ON
    DEFINE WINDOW oWnd TITLE cTitle MDI MENU BuildMenu()           
                DEFINE BUTTONBAR OF oWnd
               SET MESSAGE OF oWnd TO cTitle CENTERED
    ACTIVATE WINDOW oWnd VALID MsgYesNo( "Tem certeza?" )
    return nil

//----------------------------------------------------------------------------//
function BuildMenu()
   local oMenu
   MENU oMenu
      MENUITEM "&Cadastros"
      MENU
         MENUITEM "&Clientes..." ACTION  Clientes() MESSAGE "Cadastro de Clientes"
         SEPARATOR
         MENUITEM "&Sair"        ACTION oWnd:End()  MESSAGE "Termina Aplicativo"
      ENDMENU
      oMenu:AddMdi()              // Add standard MDI menu options
   ENDMENU
   return oMenu

//----------------------------------------------------------------------------//
function Clientes(bPrc, bAdc, bAlt, bExc, bImp, bSai)
    LOCAL oIco, oBar, oGet
    LOCAL cTitle := "Manutencao de Clientes"
    LOCAL oDlg, oBrw, nRec
    LOCAL aData := {}
    LOCAL nFor
    LOCAL oLbx, cItem
    LOCAL btnPrc, btnAdc, btnAlt, btnExc, btnImp, btnsai
    DEFAULT bPrc    := { || RecPrc( oLbx ) },;
            bAdc    := { || RecInc( oLbx ) },;
            bAlt    := { || RecAlt( oLbx ) },;
            bExc    := { || RecExc( oLbx ) },;
            bImp    := { || RecImp( oLbx ) },;
            bSai    := { || oDlg2:End() }
    if oClients != nil
       return nil
    endif
    DEFINE WINDOW oClients TITLE cTitle MDICHILD ICON oIco
    DEFINE BUTTONBAR oBar OF oClients
    DEFINE BUTTON OF oBar ACTION RecAlt(oLbx)
    nSplitH := 400
    ADO USE clientes
    //ADO SORT ON nome
    //? "Areas    : " + str( ADOAREAS() ),;
    //  "Tabela   : " + ADOALIAS(),;
    //  "Registros: " + str( ADORECCOUNT() )
    @ 0,0 LISTBOX oLbx FIELDS ADOField( "nome" ), ADOField( "email" ) ;
         HEADERS "Nome","email" ;
         FIELDSIZES 350,250 ;
         PIXEL SIZE 1000,1000 OF oClients
    oLbx:cAlias         := "ARRAY" // ADO devolve tabelas em arrays
    oLbx:bLogicLen   := { || ADORecCount() }
    oLbx:bGoTop      := { || ADOGotop() }
    oLbx:bGoBottom := { || ADOGoBottom() }
    oLbx:bSkip         := { | nSkip | ADOSkip( nSkip ) }
    oLbx:bRClicked   := {| nRow, nCol | RecMenu( nRow, nCol, oLbx ) }
    oLbx:bLDblClick  := {| nRow, nCol | RecAlt(oLbx) }
    oLbx:nStyle        := 1
    oLbx:nLineStyle  := 3
    // -> Estilo FLAT
    oLbx:nHeaderStyle  := 2
    oLbx:nHeaderHeight := 20
    oLbx:nLineHeight   := 15
    oLbx:nStyle        := nOr( WS_CHILD, WS_VSCROLL, WS_HSCROLL, WS_VISIBLE, WS_TABSTOP )

    oClients:SetControl( oLbx )
    ACTIVATE WINDOW oClients MAXIMIZED VALID( oClients := nil, ADOCLOSEALL(), .t. )

return nil

//----------------------------------------------------------------------------//
function RecMenu( nRow, nCol, oLbx )
   local oPopup
   MENU oPopup POPUP
        MENUITEM "&Incluir novo registro"  RESOURCE "bmp_binoculo" ACTION RecInc( oLbx )
        MENUITEM "&Alterar registro atual" RESOURCE ""             ACTION RecAlt( oLbx )
        MENUITEM "&Excluir registro atual" RESOURCE ""             ACTION RecExc( oLbx )
        SEPARATOR
        MENUITEM "&Procurar registro"      RESOURCE ""             ACTION RecPrc( oLbx )
        SEPARATOR
        MENUITEM "&Imprimir Listagem"      RESOURCE ""             ACTION RecImp( oLbx )
   ENDMENU
   ACTIVATE POPUP oPopup AT nRow, nCol OF oLbx
   return nil

//----------------------------------------------------------------------------//
function GenReport()
   local oWnd, oIco
   DEFINE ICON oIco FILENAME "..\icons\print.ico"
   DEFINE WINDOW oWnd MDICHILD TITLE "Clients report" ;
      VSCROLL HSCROLL ICON oIco
   ACTIVATE WINDOW oWnd
   return nil

//----------------------------------------------------------------------------//
function Show2Client()
   local oIco
   if oClient != nil
      return nil
   endif
   DEFINE ICON oIco FILENAME "..\icons\Person.ico"
   DEFINE DIALOG oClient RESOURCE "Client" ;
      ICON oIco
   REDEFINE SAY ID 3 OF oClient   // To get the proper color
   REDEFINE SAY ID 4 OF oClient
   REDEFINE SAY ID 5 OF oClient
   REDEFINE GET oName VAR cName ID ID_NAME OF oClient
   REDEFINE BUTTON ID ID_NEXT OF oClient ACTION GoNext()
   SELECT Sales     // We select Sales to properly initialize the Browse
   REDEFINE LISTBOX FIELDS ID ID_SALES OF oClient
   ACTIVATE DIALOG oClient CENTERED NOWAIT ;
      VALID ( oClient := nil, .t. )           // Destroy the object
   SELECT Clients
   return nil

//----------------------------------------------------------------------------//
function ChangeClient()
   if oClient != nil
      cName = AllTrim( Clients->Last ) + ", " + Clients->First
      oName:Refresh()
   endif
   return nil

//----------------------------------------------------------------------------//
function GoNext()
   if oClients != nil
      oClients:oControl:GoDown()
   else
      SKIP
      if EoF()
         GO BOTTOM
      endif
   endif
   ChangeClient()
   return nil

FUNCTION CLEARCHR( CICCGC )
   CICCGC = STRTRAN(CICCGC, '>', '')
   CICCGC = STRTRAN(CICCGC, '<', '')
   CICCGC = STRTRAN(CICCGC, '.', '')
   CICCGC = STRTRAN(CICCGC, '-', '')
   CICCGC = STRTRAN(CICCGC, '(', '')
   CICCGC = STRTRAN(CICCGC, ')', '')
   CICCGC = STRTRAN(CICCGC, '=', '')
   CICCGC = STRTRAN(CICCGC, '+', '')
   CICCGC = STRTRAN(CICCGC, '\', '')
   CICCGC = STRTRAN(CICCGC, '/', '')
   CICCGC = STRTRAN(CICCGC, '*', '')
   CICCGC = STRTRAN(CICCGC, ['], '')
   CICCGC = ALLTRIM(CICCGC)
   RETURN CICCGC

function fun( oque )
  msgstop( oque )
  return .t.
function tgsetmode( oque )
  return .t.
function tooltip( oque )
  return .t.
FUNCTION NewCapFirst
parameter string
declare excesao[7]
excesao[1] = " Do "
excesao[2] = " Dos "
excesao[3] = " Da "
excesao[4] = " Das "
excesao[5] = " De "
excesao[6] = " E "
excesao[7] = " Del "
novotexto = space(1)+lower(string)
fim = len(string)
for i = 1 to fim
   if substr(novotexto,i,1) = " "
      novotexto = stuff(novotexto,i+1,1,upper(substr(novotexto,i+1,1)))
   endif
next
tamanho = len(excesao)
for i = 1 to tamanho
   if excesao[i]$novotexto   && tamanho
      novotexto = stuff(novotexto,AT(excesao[i],novotexto),;
      len(excesao[i]),lower(excesao[i]))
   endif
next
RETURN(ltrim(novotexto))

//-----------------------------------------------------------
static function  RecPrc(oLbx)
    Local odlg1
    Local cCodigo:=0
    Local cSair:=" "
    Local sql
    DEFINE DIALOG oDlg1 From 0,0 To 160,250  PIXEL;
           TITLE " Procura na Tabela em Access "
    DEFINE FONT oFont NAME "FIXEDSYS" SIZE 10, -10    && Use a Nonproportional font
    SET FONT OF oDlg1 TO oFont                         && so characters line up in Says
    @ 02,05 say "Codigo : " OF oDlg1
    @ 02.2,10 get cCodigo   OF oDlg1 picture "9999" size 20,10
    @ 02.7 , 10 button "Procurar"  of oDlg1 size 40,12 action (cSair:="*",oDlg1:End())
    ACTIVATE DIALOG oDlg1 centered
    if cSair="*"
       //locate for (odbf:cAlias)->field_0001 = cCodigo
       criterio = "idpessoa Like '" + cCodigo + "%'"
       //oRs:MoveFirst()
       //oRs:Find criterio, 0, adSearchFoward
       if eof()
          msgAlert("NÆo encontrado !!!")
          go top
       endif
       oLbx:Refresh()
    endif
    return nil

//-----------------------------------------------------------
static function  RecInc(oLbx)
    LOCAL odlg3
    LOCAL cNome     := space(40)
    LOCAL cTelefone := space(14)
    LOCAL cEmail    := space(40)
    LOCAL cSair     := " "
    DEFINE DIALOG oDlg3 From 0,0 To 230,500 PIXEL TITLE " Inclusao na Tabela em Access "
           DEFINE FONT oFont NAME "FIXEDSYS" SIZE 10, -10    && Use a Nonproportional font
           SET FONT OF oDlg3 TO oFont                         && so characters line up in Says
           @ 02,05 say "Nome_____: " OF oDlg3
           @ 04,05 say "Email____: " OF oDlg3
           //
           @ 02.2,10 get cNome     OF oDlg3 picture "@!" size 150,10
           @ 04.4,10 get cEmail    OF oDlg3 picture "@!" size 150,10
           //
           @ 04.7 , 15 button "Salvar"   of oDlg3 size 40,12 action (cSair:="*",oDlg3:End())
    ACTIVATE DIALOG oDlg3 centered
    if cSair="*"
       ADO APPEND BLANK
       ADO REPLACE nome        WITH alltrim( cNome )
       ADO REPLACE email       WITH alltrim( cEmail )
       ADO COMMIT
       oLbx:Refresh()
    endif
    return nil

//-----------------------------------------------------------
static function  RecAlt(oLbx)
    LOCAL odlg3
    LOCAL nRegistro := ADORecno()
    //LOCAL cNome     := PadR( ADOField( "nome" ), 40 )
    //LOCAL cEmail    := PadR( ADOField( "email" ), 40 )
    LOCAL cNome     := ADOField( "nome" )
    LOCAL cEmail    := ADOField( "email" )
    LOCAL cSair     := " "
    DEFINE DIALOG oDlg3 From 0,0 To 230,500 PIXEL TITLE " Inclusao na Tabela em Access "
           DEFINE FONT oFont NAME "FIXEDSYS" SIZE 10, -10    && Use a Nonproportional font
           SET FONT OF oDlg3 TO oFont                        && so characters line up in Says
           //
           @ 02,05 say "Nome_____: " OF oDlg3
           @ 04,05 say "Email____: " OF oDlg3
           //
           @ 02.2,10 get cNome     OF oDlg3 picture "@!" size 150,10
           @ 04.4,10 get cEmail    OF oDlg3 picture "@!" size 150,10
           //
           @ 04.7 , 15 button "Salvar"   of oDlg3 size 40,12 action (cSair:="*",oDlg3:End())
    ACTIVATE DIALOG oDlg3 centered
    if cSair="*"
       ADO REPLACE nome       WITH alltrim( cNome )
       ADO REPLACE email      WITH alltrim( cEmail )
       ADO COMMIT
       oLbx:Refresh()
    endif
    return nil

//-----------------------------------------------------------
static function  RecExc(oLbx)
    if MsgYesNo( "Excluir este Registro ?", "Por Favor, confirme" )
       ADO DELETE
       //ADO SKIP
       oLbx:Refresh()
    endif
    return nil

//-----------------------------------------------------------
static function RecImp( oLbx )
/*
    local oRpt
    local n
    local cAlias := If( oLbx != nil, oLbx:cAlias, Alias() )
    REPORT oRpt TITLE "Relatorio: " + cAlias ;
           HEADER "Data: " + DToC( Date() ) + ", Hora: " + Time() ;
           FOOTER "Pagina: " + Str( oRpt:nPage, 3 ) ;
           PREVIEW
           if Empty( oRpt ) .or. oRpt:oDevice:hDC == 0
              return nil
           endif
           for n = 1 to FCount()
               oRpt:AddColumn( TrColumn():New( { FInfo1( cAlias, n ) },,;
                     { FInfo2( cAlias, n ) },,,,,,,,,, oRpt ) )
           next
    ENDREPORT
    ACTIVATE REPORT oRpt
    GO TOP
*/
    return nil

//--------------------------------------------
static function FInfo1( cAlias, n )
return { || ( cAlias )->( FieldName( n ) ) }

//-----------------------------------------------------------
static function FInfo2( cAlias, n )
return { || ( cAlias )->( FieldGet( n ) ) }

Function DbfDbt()
Return Nil

#include "adoxb.prg"


Bem, espero nao estar postando errado ou de forma equivocada, lembrando que estou inciando nessa estrada e espero sinceramente Ajudar com posts interessantes em um futuro breve.

Abracos.

Lincoln Wallace Procopio
Zergar
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 6
Data de registro: 08 Ago 2009 15:29
Cidade/Estado: Comodoro
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Re: ADOxb Erro

Mensagempor Zergar » 19 Ago 2009 09:03

A Linha 52 do Adoxb.ch comentei ela e nao houve mais o erro, a linha 265 do AdoXb.prg tirei os comentarios e funcionou, o que estou tendo agora e um retorno do erro:

"TOleauto/65535"

Ja andei procurando mas nao consegui encontrar nada a respeito.

Se alguem puder me ajudar fico agradecido.

ps: Estou usando o adordd para testes e implementacao da solucao que preciso, nao sei se e a melhor saida mas foi a unica que consegui usar.

Abracos.
Zergar
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 6
Data de registro: 08 Ago 2009 15:29
Cidade/Estado: Comodoro
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Re: ADOxb Erro

Mensagempor Zergar » 22 Ago 2009 18:47

Bem depois de muito procurar, conseguir usar mesmo que limitadamente o projeto ADORDD, tive alguns problemas e abandonei o mesmo, entao resolvi fazer alguns testes com ADO puro, e para a minha surpresa, achei MARAVILHOSO, entao atualmente estou, Consultando, Deletando, Accessando tabelas em DBF e Atualizando uma tabela MDB do projeto/aplicativo SIMP.

Se interessar para alguem, posto os fontes que consegui ate agora.

Abracos.
Zergar
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 6
Data de registro: 08 Ago 2009 15:29
Cidade/Estado: Comodoro
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Re: ADOxb Erro

Mensagempor gvc » 24 Ago 2009 12:20

Vc pode postar aqui ou enviar para gvcortez@uol.com.br ?

Obrigado.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar de usuário

gvc
Colaborador

Colaborador
 
Mensagens: 1269
Data de registro: 23 Ago 2005 10:57
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Re: ADOxb Erro

Mensagempor Zergar » 24 Ago 2009 19:34

Estou desenvolvendo rotinas para uso com o SIMP - Sistema Informatizado de Movimentacao de Produtos, exigencia da ANP junto a distribuidores de petroleo, como a base de dados que preciso manipular e um arquivo MDB, a melhor solucao que encontrei foi realizar essas manipulacoes pelo ADO +SQL.

Segue abaixo alguns exemplos que estou a utilizar.

Abracos.

Function Atualiza()
   LOCAL oWndVerMdb,oCnn,oRs, oBrw
   LOCAL oBar, oSay
   oCnn:=tOleAuto():new("ADODB.connection")
   oCnn:open("Provider= MicroSoft.Jet.OLEDB.4.0;Data Source=.\ARI_impac.mdb")


//--Pega o Codigo Regulado e da Instalacao em DBF
oRs:=tOleAuto():New("ADODB.RecordSet")
oRs:CursorLocation := adUseClient
oRs:CursorType := adOpenDynamic
oRs:LockType := adLockOptimistic
oRs:ActiveConnection := oCnn
oRs:Source := "SELECT * FROM SAFEMP"
oRs:Open()
f_COD_REGULA := oRs:Fields("COD_REGULA"):Value
f_COD_INSTAL := oRs:Fields("COD_INSTAL"):Value
oRs:Close()

//--Pega o Ano e Mes de Trabalho para Parametizar o SIMP de DBF
oRs:=tOleAuto():New("ADODB.RecordSet")
oRs:CursorLocation := adUseClient
oRs:CursorType := adOpenDynamic
oRs:LockType := adLockOptimistic
oRs:ActiveConnection := oCnn
oRs:Source := "SELECT SAFCFG.PRC_CODSYS FROM SAFCFG WHERE SAFCFG.PRC_MODSYS="+'"SAFSIM"'
oRs:Open()
f_MES_ANO := oRs:Fields("PRC_CODSYS"):Value
oRs:Close()

f_TIP_MOV = 1
f_QUANT_TMP = "00:00:07"

//--Pega a Quantidade de Registro da Tabela Movimento do SIMP
oRs:=tOleAuto():New("ADODB.RecordSet")
oRs:CursorLocation := adUseClient
oRs:CursorType := adOpenDynamic
oRs:LockType := adLockOptimistic
oRs:ActiveConnection := oCnn
oRs:Source := "SELECT * FROM TBDR_MOVIMENTO"
oRs:Open()
nTotal = oRs:RecordCount()
oRs:Close()

//--Exclui Dados iniciais do SIMP
oRs:=tOleAuto():New("ADODB.RecordSet")
oRs:CursorLocation := adUseClient
oRs:CursorType := adOpenDynamic
oRs:LockType := adLockOptimistic
oRs:ActiveConnection := oCnn
oRs:Source := "DELETE * FROM TBDR_REFERENCIA_MOVIMENTO"
oRs:Open()
// oRs:Close()

//--Atualiza as informacoes iniciais do SIMP
oRs:=tOleAuto():New("ADODB.RecordSet")
oRs:CursorLocation := adUseClient
oRs:CursorType := adOpenDynamic
oRs:LockType := adLockOptimistic
oRs:ActiveConnection := oCnn
oRs:Source := "SELECT * FROM TBDR_REFERENCIA_MOVIMENTO"
oRs:Open()
oRS:AddNew()
oRs:Fields("Cod_Regulado"):Value := f_COD_REGULA
oRs:Fields("Dat_MesAno_Referencia"):Value := f_MES_ANO
oRs:Fields("Qtd_Registro"):Value := nTotal
oRs:Fields("Tip_Movimento"):Value := "1"
oRs:Fields("qtd_tempo_critica"):Value := f_QUANT_TMP
oRs:Fields("qtd_tempo_carga"):Value := f_QUANT_TMP
oRs:Update()
oRs:Close()
Atualiza_MOV()

Function Atualiza_MOV()
   LOCAL oWndVerMdb,oCnn,oRs, oBrw
   LOCAL oBar, oSay
   oCnn:=tOleAuto():new("ADODB.connection")
   oCnn:open("Provider= MicroSoft.Jet.OLEDB.4.0;Data Source=.\ARI_impac.mdb")
   
   
   
   //--Exclui Dados iniciais do SIMP 
   oRs:=tOleAuto():New("ADODB.RecordSet")
   oRs:CursorLocation   := adUseClient
   oRs:CursorType       := adOpenDynamic
   oRs:LockType         := adLockOptimistic
   oRs:ActiveConnection := oCnn
   oRs:Source           := "DELETE * FROM TBDR_MOVIMENTO"
   oRs:Open()
//   oRs:Close()
   //--Pega Dados Compras Regulado em varias Tabelas, DBF´s e MDB´s
   oRs:=tOleAuto():New("ADODB.RecordSet")
   oRs:CursorLocation   := adUseClient
   oRs:CursorType       := adOpenDynamic
   oRs:LockType         := adLockOptimistic
   oRs:ActiveConnection := oCnn
   oRs:Source           :="INSERT INTO TBDR_MOVIMENTO ( SEQ_MOVIMENTO, COD_REGULADO, COD_INSTALACAO1, COD_OPERACAO, COD_INSTALACAO2, COD_PRODUTO,QTD_PRODUTO, QTD_PRODUTO_KG, NUM_NOTA_FISCAL, COD_SERIE_NF, DAT_NOTA_FISCAL, DAT_REFERENCIA, COD_MODAL, COD_VEICULO, COD_TERCEIRO, COD_MUNICIPIO, COD_ATIVIDADE_ECONOMICA, COD_PAIS, NUM_LI, NUM_DI, COD_TIPO_SERVICO, COD_CARACTERISTICA, COD_METODO,COD_UNIDADE_MEDIDA, VAL_CARACTERISTICA, COD_PROD_OPER_RESULT, VAL_MASSA_ESPECIFICA, COD_EMBALAGEM_GLP )SELECT SAFSIMP.SEQ_MOVIME, SAFEMP.COD_REGULA, SAFEMP.COD_INSTAL, 1011001 AS COD_OPERACAO, SAFFRN.COD_INSTAL,SAFSIMP.PRODUTO, format(SAFSIMP.QUANTIDADE,"+'"000000000000000"'+"), format(Str([quantidade]/100*"+'"0.87"'+")"+","+'"000000000000000"'+") AS QUAT_KL, SAFSIMP.NF_NUMERO, SAFSIMP.SERIE, SAFSIMP.DATA, SAFCFG.PRC_CODSYS, 1 AS MODAL,"+'"0000000"'+" AS VEICULO,"+'"00000000000000"'+" AS TERCEIRO,"+ '"0000000"'+" AS MUNICIPIO,"+ '"00000"'+" AS ATIVIDADE,"+ '"0000"'+" AS PAIS,"+ '"0000000000"'+" AS LIM,"+ '"0000000000"'+"AS DI,"+ '"0"'+" AS COD_SERV,"+ '"000"'+" AS COD_CARA,"+ '"000"'+" AS COD_METO,"+ '"00"'+" AS COD_UNI,"+ '"000000000"'+" AS VAL_CARA,"+ '"000000000"'+" AS COD_PRO,"+ '"0000,000"'+" AS VAL_MASSA,"+ '"00"'+" AS COD_EMBA FROM SAFEMP, SAFCFG, SAFFRN INNER JOIN SAFSIMP ON SAFFRN.COD = SAFSIMP.CODIGO WHERE SAFFRN.COD_INSTAL>"+'"0"'+ " AND "+"SAFSIMP.OPERACAO="+'"COMPRAS"'+" AND "+"SAFCFG.PRC_MODSYS="+'"SAFSIM"'

//"INSERT INTO TBDR_MOVIMENTO ( SEQ_MOVIMENTO, COD_REGULADO, COD_INSTALACAO1, COD_OPERACAO, COD_INSTALACAO2, COD_PRODUTO, QTD_PRODUTO, QTD_PRODUTO_KG, NUM_NOTA_FISCAL, COD_SERIE_NF, DAT_NOTA_FISCAL, DAT_REFERENCIA ) SELECT SAFSIMP.SEQ_MOVIME, SAFEMP.COD_REGULA, SAFEMP.COD_INSTAL, 1011001 AS COD_OPERACAO, SAFFRN.COD_INSTAL, SAFSIMP.PRODUTO, format(SAFSIMP.QUANTIDADE,"+'"000000000000000"'+"), format(Str([quantidade]/100*"+'"0.87"'+")"+","+'"000000000000000"'+") AS QUAT_KL, SAFSIMP.NF_NUMERO, SAFSIMP.SERIE, SAFSIMP.DATA, SAFCFG.PRC_CODSYS FROM SAFEMP, SAFCFG, SAFFRN INNER JOIN SAFSIMP ON SAFFRN.COD = SAFSIMP.CODIGO WHERE SAFFRN.COD_INSTAL>"+'"0"'+ " AND "+"SAFSIMP.OPERACAO="+'"COMPRAS"'+" AND "+"SAFCFG.PRC_MODSYS="+'"SAFSIM"'

oRs:open()

VerMdb()
Zergar
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 6
Data de registro: 08 Ago 2009 15:29
Cidade/Estado: Comodoro
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Re: ADOxb Erro

Mensagempor rochinha » 11 Jan 2010 10:15

Amiguinho

Espero que tenha resolvido o problema, espero também que o ADOxB tenha servido de base para o aprendizado de uso do ADO.

Desculpe-me por não ter respondido antes, pois exatamente no mes de Agosto eu estava, encarcerado(pensão), e fiquei impossibilidado nos ultimos meses de colocar minha vida virtual em dia e verificar os post do forum.

Garanto que neste forum voce irá encontrar pérolas para todos intuitos postadas por todos forenses que por aqui passam e deixam sua contribuição.

Tendo mais duvidas sobre ADO, esteja a vontade para questionar.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

ADOxb Erro

Mensagempor Hasse » 18 Mai 2019 20:38

Boa noite colegas.

Estou com um problema e não sei como sair da 'sinuca de bico'.

Estive analisando o PRG do Zergar acima, e observei que ele abre uma tabela, faz a leitura dos dados e fecha a tabela.
Em seguida abre a segunda tabela, lê e fecha.
Com a terceira tabela faz o mesmo.
Em todos usa RECORDSET.
Isto funciona para vários loop's seguidos ? Não fica lento ?

Seguido............

Tenho 3 tabelas dentro de um banco FIREBIRD (*.FDB):
Tabela 'A'
Tabela 'B'
Tabela 'C'

Tabela 'A': NUMERONF, FORNECEDOR,... e outros.
Tabela 'B': NUMERONF, CODIGO,... e outros.
Esta tabela contém os vários itens da Nota Fiscal acima. O link entre as duas é o campo NUMERONF.
Tabela 'C': CODIGO, DESCRICAO, VALVENDA, VALCOMPRA, VALCUSTO,... e outros.
O link entre as tabelas 'B' e 'C' é o campo CODIGO.

Os dados das tabelas 'A' e 'B' são gravados na tabela 'C'.

No Harbour abre-se as 3 tabelas e alterna-se entre tabelas com DBSelectArea( c_Tabela ).

No ADO, tentei fazer desta mesma forma, usando ADO USE c_Tabela ou ADOUSE( c_Tabela ), mas este procedimento não funciona sempre.
Parece que há um limite.

O quê devo fazer para sair dessa ?

Usando o RELACIONAMENTO entre tabelas ? Como se faz isto ?
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 815
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 24 vezes

ADOxb Erro

Mensagempor JoséQuintas » 18 Mai 2019 21:49

Não confunda ADO com gambiarras de usar ADO.
Não confunda comandos do banco de dados com comandos ADO.
Não confunda uso de gambiarra com uso do ADO.
Não confunda banco de dados firebird com DBF.

Fazendo isso, vai resolver sua questão, porque está misturando tudo e querendo resultado usando tudo errado.
Entenda o que é cada coisa, e veja como resolver cada parte com cada "ferramenta".

1) No banco de dados firebird deve existir relacionamento direto no banco de dados, e já puxar automático
Firebird não é DBF. Deve ter recursos pra isso.

2) Comandos SQL permitem relacionamento. Se é banco de dados cliente/servidor, ele não foi feito pra ficar igual DBF navegando um registro por vez.

3) Não adianta alguém tentar passar comando, porque só você conhece os campos e como definiu as bases de dados, e além disso, pra cada situação (base de dados, tabelas, etc) pode existir um comando mais adequado

4) Não é ruim abrir/fechar tabelas?
Não é igual DBF.
O que se abre é a conexão com o gerenciador do banco de dados, e não com as tabelas.
E o que se usa não são as tabelas, e sim o resultado de pesquisas.

Usar outros bancos de dados igual DBF, isso é apenas quebra-galho, com muuuuuuuuuuuuita perda de desempenho.
Se tá nesse nível, melhor voltar pra dbf, que o desempenho será muuuuito melhor.

Essa foi minha intenção quando mostrei o uso direto do ADO: pra que se enxergue o que acontece

cnConexao:Open()
oResultado := cnConexao:Execute( "SELECT NUMERONF, FORNECEDOR, CODIGO, DESCRICAO, VALVENDA, ..... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ..." )
DO WHILE ! oResultado:Eof()
   oResultado:MoveNext()
ENDDO
oResultado:Close()


Como o programa usa cada tabela, cada relacionamento, cada sei lá.... não usa, pede pronto.
Como fazer no ADO?.... o ADO usa recursos do banco de dados, precisa ver o que o banco de dados exige/permite
Como fazer no "usador de ADO" igual DBF? vai ter que olhar o "usador de ADO" que está usando, pra ver o que ele permite, se ele permite usar todos os recursos do ADO e do banco de dados.

Se usar direto ADO e Firebird, vai poder perguntar a qualquer programador de qualquer linguagem de programação.
Se usar "usador de ADO", só vai poder perguntar pra quem usa isso com Firebird, o que vai ser muito mais limitado.
Então... o melhor negócio é aprender cada parte do que está usando, e não apenas os comandos de programação, que não representam NADA do ADO ou do Firebird.

Recapitulando:
- entenda o que está usando pra acessar o ADO
- entenda ADO
- entenda comando SQL
- entenda Firebird
Não necessariamente nessa ordem.

É como se estivesse usando "5 programas" diferentes conversando entre si.
programa -> RDD -> ADO -> SQL -> Firebird

Quem vai saber responder? quem usa os mesmos "5 programas".
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

ADOxb Erro

Mensagempor janio » 20 Mai 2019 08:44

Tentei usar ADO e até que gostei. Mas quando descobri que tem que instalar (e configurar) o DRIVER ODBC em TODAS as estações... desisti. Pra mim seria um custo muito alto na hora de fazer manutenções, reinstalações, etc...

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

ADOxb Erro

Mensagempor JoséQuintas » 20 Mai 2019 08:59

janio escreveu:Tentei usar ADO e até que gostei. Mas quando descobri que tem que instalar (e configurar) o DRIVER ODBC em TODAS as estaçõe


Configurar driver ODBC?
Lembro que o XHarbour ensinava desse jeito, talvez pra espantar o interesse ao ADO, ou falta de conhecimento de quem ensinava.

O que precisa pra usar ADO:
Instalar o ODBC da base que vai usar (MySQL, Firebird, Excel, etc)

Infelizmente, a Oracle usa Microsoft Visual C, que também pode ser usado no desenvolvimento em Harbour.
MSVC exige que o run-time do MSVC esteja instalado na máquina.

Instalar = executar o programa de instalação e clicar em next, next, next, next, finish.
Dois links na internet para o usuário baixar e executar, e tá resolvido.
Isso gera custo?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

ADOxb Erro

Mensagempor janio » 20 Mai 2019 16:27

Configurar driver ODBC?

Sim. Com Mediator tenho que configurar o ODBC conforme imagem anexa.

Isso gera custo?


Sim. Se um processo que leva 1min passe a levar 10, isso vai me gerar um custo alto pq TEMPO é DINHEIRO. Tempo, alias, eh o que eu tenho de mais precioso.
Anexos
odbc.png
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

ADOxb Erro

Mensagempor JoséQuintas » 20 Mai 2019 18:05

Já tentou ver outra opção?

Aí está configurando uma conexão, que vai ficar pronta para o programa, pra não ter que colocar parâmetros no programa.
Resta saber se o mediator aceita através de parâmetros, ao invés de criar a conexão no Windows.

Não exatamente estes nomes:

connectionstring="mysql,porta=,servidor=,usuário=,senha=,...."

connectionstring="dsn=dsnmediator" // configurada como fonte ODBC

Inclusive....
Aí sua segurança vai toda pro lixo, porque qualquer programa vai poder usar a conexão pronta, até mesmo um simples Excel, ou script texto.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 12 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro