Página 4 de 6
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 29 Nov 2013 11:46
por Hasse
Bom dia Rochinha.
Estou tentando entender e digerir todas estas informações contidas neste tópico, mas tenho dificuldades para entender determinadas colocações. Se o amigo puder me orientar, ficarei muito grato.
Acho uma boa voce usar comandos SQL para acesso a DBFs para que vá aprendendo a manipular esta forma de obtenção de dados.
Isto quer dizer que se pode usar o ADO para cessar DBF's ?
Desta forma eu poderia testar o aplicativo usando DBF's e depois portá-los para o Oracle ? Eu não tenho o Oracle instalado em meu Desktop.
Se isto for possível realmente, por favor, como devo proceder ?
Isto me interessa de imediato, pois estou tendo enormes dificuldades com um interfaceamento do meu cliente com um Oracle externo (o meu cliente é fornecedor de comercial do cliente possuidor do Oracle versão 10g).
Outro detalhe amigo, todos os links que apontam para o FiveWin (5Evolution) estão quebrados.
Os meus agradecimentos antecipados.
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 29 Nov 2013 13:17
por rochinha
Amiguinho,
Isto quer dizer que se pode usar o ADO para cessar DBF's ?
Com certeza que sim, voce apenas terá de fazer a conecção/conexão e usar o comando EXECUTE onde passará a sentença SQL.
Outro detalhe amigo, todos os links que apontam para o FiveWin (5Evolution) estão quebrados.
Estou resolvendo isto(mudança de endereço, montagem do escritório) e em breve o site estará de volta.
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 29 Nov 2013 14:06
por Hasse
Boa tarde Rochinha.
E, de que forma eu posso simular um Banco Oracle, sem ter o Oracle disponível ?
Bastaria criar os DBF's com os mesmos campos do Banco Oracle ? (pelo menos aquelas Tabelas e Campos aos quais tenho acesso)
Acredito que neste caso eu teria diferenças no que toca aos inter-relacionamentos internos do Banco, mas para testar as rotinas de select, leitura e gravação (update) acredito que seria viável. Estou correto ?
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 29 Nov 2013 14:31
por rochinha
Amiguinho,
SQL é uma linguagem única e duvido que de banco para banco exista diferenças gritantes, portanto não há o que temer.
Para testar o uso de um Oracle voce pode optar por baixar e instalar
Oracle Database 11g Express Edition
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 31 Mar 2014 19:13
por ALMMa
Pessoal,
Sou novo por aqui.
Temos uma grande mudança pela frente em nosso sistema, atualmente em xHarbour.
Basicamente, precisamos remover toda a casca dele e integrar com um aplicativo em .NET, mantendo parte das funções e eliminando outras.
Então, resolvemos dar uma testada no SQLRDD mas os exemplos não compilaram.
Daí vimos o ADOxb e resolvemos testar também, já que tem a vantagem de gerar comandos na mão e ter maior controle...
Baixamos o CH e o PRG mais novos e copiamos um código de testes.
Quase tudo funciona... só que na hora do
dá o seguinte erro:
Código: Selecionar todos
Error ADODB.Recordset/6 DISP_E_UNKNOWNNAME: END
Arguments: ()
O log gerado aponta pra ADOXB.PRG (511), onde tem:
A conexão é feita, os registros são filtrados e/ou alterados, tudo parece funcionar.
Mas na hora de fechar, dá erro.
Basicamente, a mesma coisa acontece se usar um
Alguma ideia?
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 31 Mar 2014 22:48
por rochinha
Amiguinho,
Nas funções ADOUse() e ADOCloseAll() as linhas onde existam este comando poderão ser suprimidas sem problemas ao conjunto.
Nos objetos Record e RecordSet não reparei a inexistencia do método End(). Mas não me ocorreram erros até agora.
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 26 Dez 2014 19:41
por Hasse
Boa noite Rochinha.
Estou desenvolvendo um aplicativo que exporta dados de um DBF para GDB do Firebird.
Na fase de testes já estou exportando dados de forma correta.
O problema é quando tento usar o comando ADO EXECUTE "DROP TABLE Estoque" para zerar a tabela de destino antes do início da exportação.
Abaixo o ErrorLog do erro:
Descrição do erro .............: [ODBC Firebird Driver][Firebird]unsuccessful metadata update object ESTOQUE is in use (0x80004005)
Nome do arquivo ...............: Microsoft OLE DB Provider for ODBC Drivers
Objeto do Erro ................: EXECUTE
Área - Select() ...............: 1
TraceLog do Erro:
TOLEAUTO:EXECUTE.Linha: 0 Módulo:
ADOEXECUTE.......Linha: 551 Módulo: FireFio.prg
MAIN.............Linha: 46 Módulo: FireFio.prg
O mesmo acontece com outros usos da comando ADO EXECUTE.
Esta é a linha onde ocorre o erro:
Abaixo como uso comando ADO EXECUTE:
Abaixo o valor de cSql listado pelo ErroLog:
Tamanho Variável Tipo Valor
--------------------------------------------
18 Bytes -> cSQL Tipo C => DROP TABLE Estoque
Qual é o meu erro ?
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 27 Dez 2014 00:56
por rochinha
Amiguinho,
Coloque um trecho maior de código. Somente a linha que ocorre o erro não é o bastante para entender o porque.
Pela tradução visual da mensagem, indica que você está tentando deletar uma tabela que esta em uso.
Para deletar a tabela, apenas faça a conexão com o banco de dados e não selecione a tabela.
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 27 Dez 2014 09:25
por Hasse
Bom dia Rochinha.
Segue o fonte completo.
No final do .prg já estão comentadas mais 2 linhas do comando ADO EXECUTE, que também não funcionam.
Quanto às 2 linhas seguintes, eu já li em teus comentários anteriores, que não funcionam. OK.
#include "adoXb.ch" ------->>> esta linha já existe no ado.ch. Ela pode ser retirada daqui ?
No Anexo também segue o arquivo do ErrorLog completo.
FireFio.prg
Código: Selecionar todos
**
#include "adoXb.ch"
#include "AdoXb.prg"
*
#Include 'Inkey.ch'
#Include 'i_keybd.ch'
#include "MiniGUI.ch"
#include "ado.ch"
#include "set.ch"
#include "common.ch"
#include "directry.ch"
#include "fileio.ch"
#include "hbcompat.ch"
#include "hbwin.ch"
*
*STATIC oWnd, oClients, oClient, oName
*STATIC cName
*STATIC oSplit
*
REQUEST HB_GT_WIN_DEFAULT && Janela DOS - Temporário para testes.
*
*==================================================================================================
FUNCTION Main()
*
LOCAL oError := ErrorBlock( { | oError | MyErrorFunc( oError ) } )
*
PUBLIC oMenu, user_nivel := 5
PUBLIC StrDatabas := "C:\Teste\Exemplo.gdb"
PUBLIC StrConnect := "DRIVER=Firebird/InterBase(r) driver; UID=sysdba; PWD=masterkey; DBNAME="+StrDatabas
*
// Necessária para criar objetos e variaveis visiveis o tempo todo
ADOSetRDD( "FIREBIRD" ) // ADOGDB
ADORDDDefault( "FIREBIRD" ) // ADOGDB
cADORDD := "FIREBIRD"
*
ADO CONNECT StrConnect
*
ADO USE Estoque
*
ADO SELECT Estoque
ADO GOBOTTOM
*
ADO EXECUTE "DROP TABLE Estoque"
*
SELE 1
c_Estoque := 'D:\Dev\Clipper\Datafio\Estoque'
USE ( c_Estoque )
*
Clear
*
WHILE Estoque->( ! EOF() )
*
@ 08,00 say Estoque->( Recno() )
*
IF Estoque->FG = "1"
*
c_Referen := Estoque->CODIGO
c_Descric := Estoque->DESCRICAO
n_Quantid := Estoque->QUANT
*
@ 10,10 say n_Reg
@ 11,10 say c_Referen
@ 12,10 say c_Descric
*
nRegistros := ADORecCount()
n_Reg := nRegistros + 01
c_Registro := StrZero( n_Reg, 10 )
c_Codigo := StrZero( n_Reg, 05 )
*
ADO APPEND BLANK
ADO REPLACE REGISTRO WITH c_Registro && 10
ADO REPLACE CODIGO WITH c_Codigo && 5
ADO REPLACE REFERENCIA WITH c_Referen && 14
ADO REPLACE DESCRICAO WITH c_Descric && 45
ADO REPLACE QTD_ATUAL WITH n_Quantid && Double
ADO COMMIT
*
ENDIF
*
Estoque->( DBSkip() )
*
ENDDO
*
* c_Str := 'Select REGISTRO, REFERENCIA, QTD_ATUAL from ESTOQUE'
* ADO EXECUTE ( c_Str )
*
* ADO CLOSE ALL
* ADO CLOSE
*
RETURN( nil )
Outra dúvida:
Como se faz leitura de valores da Tabela com o ADO ?
Abaixo o arquivo do ErrorLog.
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 27 Dez 2014 16:31
por Hasse
Boa tarde Rochinha.
O DROP funcionou da forma como você postou. Antes de selecionar a tabela.
Mas, eu troquei alhos por bugalhos.
O DROP ele deleta a Tabela do Banco de Dados. Na realidade eu quero é zerar a Tabela, ou seja, o equivalente ao ZAP do DBF. Como se faz ?
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 29 Dez 2014 10:35
por rochinha
Amiguinhos,
#include "adoXb.ch" ------->>> esta linha já existe no ado.ch. Ela pode ser retirada daqui ?
Este .CH possui INCLUDEs expecificos para uso da biblioteca. Verifique e compare, o que for duplicado elimine.
Quanto a ZAPear uma tabela SQL é o seguinte. Por padrão usamos DROP e depois CREATE para recriar a tabela.
Verifique na biblioteca se eu acrescentei algum comando que simule o ZAP, senão, continue usando o feijão-com-arroz.
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 29 Dez 2014 15:59
por Hasse
Boa tarde Rochinha.
Pesquisei no ADOxB.PRG e não tem ZAP nem DROP.
E como seria este feijão-com-arroz ?. Eu ainda não consegui zerar uma tabela via *.PRG.
No ADOxB.ch tem os comandos abaixo:
#xcommand ADO SQL CREATE <*cSQL*> => ADOEXECUTE( 'CREATE '+ <(cSQL)> )
#xcommand ADO SQL DROP <*cSQL*> => ADOEXECUTE( 'DROP ' + <(cSQL)> )
1)-Na função Function ADODBCREATE( cDatabase ), qual é a estrutura de cDatabase ? Semelhante ao usado para criar DBF ?
2)-Na função Function ADOSetOrder( nIDXOrder ), a variável nIDXOrder é o nome da coluna da tabela ?
3)-Qual a utilidade das funções abaixo:
Function ADORequery()
Function ADOReSync()
Function ADOUpdateBatch()
Function ADOSave( cfile )
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 30 Dez 2014 17:16
por rochinha
Amiguinhos,
O feijão-com-arroz é a forma básica mesmo, DROP e depois CREATE. Mas no caso de apenas eliminar os registros voce irá usar a sentença DELETE FROM.
Neste exemplo você ve o feijão-com-arroz:
Código: Selecionar todos
#include "adoxb.ch"
function CUSTOMER(cTitle)
// Necessária para criar objetos e variaveis visiveis o tempo todo
ADOSetRDD( "ACCESS" )
if ADORDDDefault() = "FIREBIRD" // ADOGDB
StrDatabase := ".\adogdb.gdb"
StrConnection := "DRIVER=Firebird/InterBase(r) driver; UID=sysdba; PWD=masterkey; DBNAME="+StrDatabase
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
// Abre as tabelas
ADO USE clientes
// 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 CLOSE ALL
return nil
Perceba que DROP/CREATE recriam a estrutura vazia, mas você pode usar o comando DELETE passando a ele sentenças SQL diversas:
Código: Selecionar todos
...
// ADO DELETE SuaSentenca
ADO DELETE from tabela
...
Ou:
Código: Selecionar todos
...
// ADO DELETE SuaSentenca
ADO DELETE * from tabela
...
Neste comando voce diz: "delete de...", "delete dentro...", "delete em...". Então voce estará limpando a tabela de seu conteúdo e não da estrutura.
Quanto a utilidade das funções, em outro build da biblioteca, colocarei no código os comentários sobre cada uma.
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 07 Jan 2015 19:20
por Hasse
Boa tarde.
Estou batalhando uma forma trabalhar com o ADO, e preciso de ajuda.
Vejam o código abaixo, onde ocorre um erro na linha 25 - Variável NOME não existe.:
Código: Selecionar todos
StrConnect := "DRIVER=Firebird/InterBase(r) driver; UID=sysdba; PWD=masterkey; DBNAME=C:\Teste\Small.gdb"
ADO CONNECT StrConnect
ADO USE CliFor
? "ADOAreas:=>", Str( ADOAreas(), 04 ), "= ADOAlias:=>", ADOAlias()
*
oRecordSet := TOLEAUTO():New("ADODB.RecordSet")
c_SeleStr := "select NOME, ENDERE, CIDADE, ESTADO from CliFor"
WITH Object oRecordSet
*
:cursorType := adOpenDynamic // // adOpenForwardOnly // adOpenForward // adOpenStatic //
:activeConnection := oADOConection[nConnection]
:cursorLocation := adUseClient
:maxRecords := 100000
:cacheSize := 100
:source := c_SeleStr
*
:open()
*
IF ! :Eof()
*
? NOME, ENDERE, CIDADE, ESTADO && <<<======= LINHA DO ERRO.
*
:MoveNext()
*
ENDIF
*
END WITH
Evidente que estou cometendo um erro, e aceito sugestões para alterações profundas.
Num segundo momento quero sofisticar o Select para um formato semelhante ao abaixo:
Código: Selecionar todos
c_SeleStr := "select NOME c_Nome, ENDERE c_Ender, COMPLE c_Bairro, CGC c_CgcCpf, CIDADE c_Cidade, ESTADO c_Est, CEP c_Cep, FONE c_Fones, where c_Nome like '*Maria*' order by c_Nome"
Num terceiro momento preciso gravar dados na tabela.
*** ADOxb - BIblioteca de funções de Acesso SQL ***
Enviado: 07 Jan 2015 19:43
por ANDRIL
Hasse escreveu:? NOME, ENDERE, CIDADE, ESTADO && <<<======= LINHA DO ERRO.
Não tenho nenhum conhecimento sobre o ADO, mas não seria o caso de tratar o objeto
oRecordSet, onde os dados devem estar. Achei estranho voce acessar direto os campos, porem, se isso for possível, talvez haja um problema com a area em aberto que não contém estes campos citados no erro.
Boa sorte.