Página 2 de 4

Browse pra ADO

Enviado: 15 Abr 2020 12:32
por JoséQuintas
Itamar M. Lins Jr. escreveu:Ainda penso que vc não entenderam o poder do SQLMIX.
Usando SQLMIX, o acesso é nativo, não precisa ADO, ODBC... Isso é opcional.
Na prática penso o contrário:

Se estão fazendo errado, é porque ninguém de HWGUI ajuda.
É só usar o TBrowse de ADO como referência.
Ou será que só eu, que nem uso HWGUI, sei disso?

Browse pra ADO

Enviado: 15 Abr 2020 12:58
por Itamar M. Lins Jr.
Ola!
Se estão fazendo errado, é porque ninguém de HWGUI ajuda.
Não vi perguntas sobre SQLMIX.
Já coloquei no forum, algumas formas de acesso pelo SQLMIX. Usei ODBC.
Também não vi fazendo errado.
Não vi ninguém perguntando, só combatendo...
Se usar qualquer forma que não seja SQLMIX, sempre terá que usar "DO WHILE" para compor o ARRAY e depois terá que ler o ARRAY->memvar para variáveis.
Seja dbedit,tbrowse, browse da hwgui, etc... SQLMIX não tem nada a ver com HWGUI.
Funciona com qualquer OS e com qualquer visual... WVT,WVG,etc!
ADO = ARRAY do WINDOWS (OS) para manipular usamos comandos ADO, rs:MOVEFIRTS etc... SQLMIX ARRAY do HARBOUR! (DBF) DBSKIP,GOTOP() etc...

Saudações,
Itamar M. Lins Jr.

Browse pra ADO

Enviado: 15 Abr 2020 13:05
por JoséQuintas
Itamar M. Lins Jr. escreveu:ADO = ARRAY do WINDOWS (OS) para manipular usamos comandos ADO, rs:MOVEFIRTS etc... SQLMIX ARRAY do HARBOUR! (DBF) DBSKIP,GOTOP() etc...
Concordo e discordo.

Tres pontos importantes:

Muitos usando XHARBOUR e xHarbour NÃO TEM SQLMIX.
Muitos usando somente Windows.
ADO acaba juntando mais a comunidade do que SQLMIX.

E vamos concordar... sair do DBF... pra continuar escrevendo igual DBF....
put. que par... vai gostar de DBF assim lá longe... porque ficar diferente de tudo que é linguagem de programação?

Browse pra ADO

Enviado: 15 Abr 2020 13:11
por JoséQuintas
Itamar M. Lins Jr. escreveu:ADO = ARRAY do WINDOWS (OS) para manipular usamos comandos ADO, rs:MOVEFIRTS etc... SQLMIX ARRAY do HARBOUR! (DBF) DBSKIP,GOTOP() etc...
E se for só esse o problema:

Código: Selecionar todos

CREATE CLASS ADOClass
   VAR Rs
   METHOD GoTop()  INLINE Rs:MoveFirst()
   METHOD GoBottom() INLINE Rs:MoveLast()
   METHOD Skip( n )  INLINE Rs:Move( iif( n == NIL, 1, n ) )
   METHOD FieldGet( x ) INLINE Rs:Fields( x ):Value
   METHOD LastRec() INLINE Rs:RecordCount()
  ENDCLASS

Código: Selecionar todos

x := ADOClass():new()
x:Rs := cn:Execute( "SELECT * FROM CLIENTES" )
DO WHILE ! x:Eof()
   ? x:FieldGet( "CODIGO" )
   ? x:FieldGet( "NOME" )
  x:Skip()
ENDDO

Browse pra ADO

Enviado: 15 Abr 2020 13:28
por JoséQuintas
O legal disso é que dá pra contornar as diferenças do recordset.

Por exemplo:

Se não tem retorno, o recordset é NIL, então nem dá pra testar EOF() ou BOF()
Usando uma classe, isso pode ser facilmente resolvido assim:

METHOD Eof() INLINE iif( Rs == NIL, .T., Rs:Eof() )
METHOD Bof() INLINE iif( Rs == NIL, .T., Rs:Bof() )

O mesmo pra outras diferenças.

O ADO faz o que o SQLMIX faz, ok.
Mas.... no SQLMIX quem trabalha é o Harbour, no ADO quem trabalha é o Windows.
Quem é mais rápido? o Harbour ou o Windows?
Quem aproveita melhor os recursos do Windows? o Harbour ou a Microsoft?

Então... ao invés de discutir qual é o melhor, basta quem puder ajudar... ajudar.
E com certeza HWGUI pode usar diretamente ADO no Browse.
Quem conhece HWGUI? quem? quem? Raimundo Nonato !!!!

Browse pra ADO

Enviado: 15 Abr 2020 13:42
por Itamar M. Lins Jr.
Ola!
put. que par... vai gostar de DBF assim lá longe... porque ficar diferente de tudo que é linguagem de programação?
Quem disse que é da forma que vc está pensando e escrevendo erradamente ?
Vc não sabe. Eu usei e uso ADO e SQLMIX.
Todos vão precisar converter o "RESULTADO" a sentença SQL, para a linguagem em questão.
Vai ver como o PHP abre um SGBD em SQL e manipula o ARRAY. Cada linguagem tem sua forma de MANIPULAR os DADOS.
SQL é UNIVERSAL, mas a forma como cada linguagem trata o RETORNO(RESULT), é que faz a diferença.
Nós programadores xBASE estamos acostumados usar SKIP, GOTO... Como vc faz para ir para o topo de uma array usando PHP por exemplo ?
Vc está condicionado ao ADO, precisa se descondicionar. Qual é o mais fácil RS:MOVE_ETC... ou DBGOTOP() ?
ADO é para quem está APENAS no WINDOWS.
SQLMIX não salvamos nem alteramos NADA, usam SQL para isso. MANIPULAMOS o resultado usando SINTAXE DBF(xBase), nos movemos nele pq é DBF_ARRAY.
Não é um arquivo físico. E funciona em LINUX e WINDOWS é parte integrante de Harbour.
A mesma coisa é a classe do Rodrigo Moreno para Postgree não tem nada de ADO, nem de SQLMIX.

Código: Selecionar todos

#require "hbpgsql"

PROCEDURE Main( cHost, cDatabase, cUser, cPass )

   LOCAL cQuery, oQuery, oRow, i, x

   LOCAL oServer := TPQServer():New( cHost, hb_defaultValue( cDatabase, "postgres" ), cUser, cPass )

   IF oServer:NetErr()
      ? oServer:ErrorMsg()
      RETURN
   ENDIF

   oServer:SetVerbosity( 2 )
   oServer:traceon( "simple.log" )

   ? "Tables..."

   FOR EACH i IN oServer:ListTables()
      ? i
   NEXT

   IF oServer:TableExists( "test" )
      ? oQuery := oServer:Execute( "DROP TABLE test" )

      oQuery:Destroy()
   ENDIF

   ? "Creating test table..."
   cQuery := ;
      "CREATE TABLE test(" + ;
      "   Code integer not null primary key," + ;
      "   dept Integer," + ;
      "   Name Varchar(40)," + ;
      "   Sales boolean," + ;
      "   Tax Float4," + ;
      "   Salary Double Precision," + ;
      "   Budget Numeric(12,2)," + ;
      "   Discount Numeric(5,2)," + ;
      "   Creation Date," + ;
      "   Description text )"

   oQuery := oServer:Query( cQuery )

   IF oQuery:NetErr()
      ? oQuery:ErrorMsg()
   ENDIF

   oQuery:Destroy()

   ? "Structure of test table"

   FOR EACH i IN oServer:TableStruct( "test" )
      ?
      FOR EACH x IN i
         ?? x, ""
      NEXT
   NEXT

   ? "Inserting, declared transaction control"
   oServer:StartTransaction()

   FOR i := 1 TO 10
      cQuery := "INSERT INTO test(code, dept, name, sales, tax, salary, budget, Discount, Creation, Description) " + ;
         "VALUES( " + hb_ntos( i ) + ", 2, 'TEST', 'y', 5, 3000, 1500.2, 7.5, '2003-12-17', 'Short Description about what ?')"

      oQuery := oServer:Query( cQuery )

      IF oQuery:NetErr()
         ? oQuery:errorMsg()
      ENDIF

      oQuery:destroy()
   NEXT

   oServer:Commit()

   oQuery := oServer:Query( "SELECT code, name, description, sales FROM test" )

   FOR EACH i IN oQuery:Struct()
      ? i[ 1 ], i[ 2 ], i[ 3 ], i[ 4 ]
   NEXT

   ? "Fields:", oQuery:FCount()

   oRow := oQuery:Blank()

   ? ;
      oRow:FCount(), ;
      oRow:FieldPos( "sales" ), ;
      oRow:FieldGet( 1 ), ;
      oRow:FieldName( 2 ), ;
      oRow:FieldType( 1 ), ;
      oRow:FieldDec( 1 ), ;
      oRow:FieldLen( 1 )

   oRow:FieldPut( 1, 150 )
   oRow:FieldPut( 2, "MY TEST" )

   ? oRow:FieldGet( 1 ), oRow:FieldGet( 2 )

   ? oRow:aRow[ 1 ], oRow:aRow[ 2 ], oRow:aOld[ 1 ], oRow:aOld[ 2 ]

   ? oQuery:Append( oRow )

   ? oQuery:ErrorMsg()

   DO WHILE ! oQuery:Eof()
      ? ;
         oQuery:RecNo(), ;
         oQuery:FieldPos( "code" ), ;
         oQuery:FieldGet( oQuery:FieldPos( "code" ) ), ;
         oQuery:FieldGet( 4 ), ;
         oQuery:FieldGet( 2 ), ;
         oQuery:FieldName( 1 ), ;
         oQuery:FieldType( 1 ), ;
         oQuery:FieldDec( 1 ), ;
         oQuery:FieldLen( 1 ), ;
         oQuery:FieldGet( 3 )

      IF oQuery:RecNo() == 50
         oRow := oQuery:getrow()

         oRow:FieldPut( 2, "My Second test" )
         ? "Update:", oQuery:Update( oRow )
      ENDIF

      IF oQuery:RecNo() == 60
         oRow := oQuery:getrow()
         ? "Delete:", oQuery:Delete( oRow )
      ENDIF

      oQuery:Skip()

   ENDDO

   oQuery:Refresh()

   FOR i := 1 TO oQuery:LastRec()
      oRow := oQuery:getrow( i )

      ? i, ;
         oRow:FieldGet( oRow:FieldPos( "code" ) ), ;
         oRow:FieldGet( 4 ), ;
         oRow:FieldGet( 2 ), ;
         oRow:FieldName( 1 ), ;
         oRow:FieldType( 1 ), ;
         oRow:FieldDec( 1 ), ;
         oRow:FieldLen( 1 ), ;
         oRow:FieldGet( i, 3 )

   NEXT

   oQuery:Destroy()

   oServer:Destroy()

   ? "Closing..."

   RETURN
Olha ai uma outra forma que ele criou, para trabalhar com o resultado do ARRAY quem vem.
Veja que ele usa a mesma técnica. Ora parece ADO, ora ele usa LASTREC()...

Não é questão de PIOR nem MELHOR, DBSKIP, não é melhor nem PIOR que RS:MOVELAST, e vice versa.

Saudações,
Itamar M. Lins Jr.

Browse pra ADO

Enviado: 15 Abr 2020 13:54
por Itamar M. Lins Jr.
Ola!
Muitos usando XHARBOUR e xHarbour NÃO TEM SQLMIX.
Lógico, é para os usuários comprarem o RDDSQL() (EMULADOR de DBF dentro do SGBD) Ai sim eu concordo quando diz, que não consegue se livrar do DBF.

Saudações,
Itamar M. Lins Jr.

Browse pra ADO

Enviado: 15 Abr 2020 14:05
por JoséQuintas
cjp escreveu:Fui tentar fazer uma restrição de campos para exibir, mas não funcionou.
O que chama de restrição de campos?
Isso confunde se é pra ter menos campos, ou se é pra filtrar informações.

O ADO tem a opção FILTER() onde se passa uma expressão no formato ADO, parecida com SQL mas nem sempre igual.

Exemplo: oRs:Filter( "NOME LIKE 'JOS%' " )

Lembrando que o filtro é LOCAL, não tem a ver com acessar servidor.

Browse pra ADO

Enviado: 15 Abr 2020 14:09
por MSDN
Se o Kresin conseguir fazer o que está escrito na página de apresentação do Xailer :
https://www.xailer.com/wp/

O ponto é esse :
Conexión con múltiples bases de datos: Nativo SQLITE y MYSQL, ADO y como Web Service
com atenção especial para WebService

Outro ponto que deve ser levado muito em consideração :
La ventaja de Xailer frente al resto de entornos de desarrollo es su sencillez, por ser básicamente una herramienta de desarrollo de software de gestión basada inicialmente en el estándar Xbase, aunque actualmente está más centrada en bases de datos SQL pero siempre intentando en lo posible incluir la simplicidad del uso Xbase en el acceso a las nuevas BBDD.
Se HwGUI fizer isso, fica perfeito, pq no final das contas, independente da lib gráfica que vai fazer a "casca", o que realmente importa é manipular os dados, e se focar no WebService, ter um software consumindo corretamente uma instância de um banco de dados na nuvem, fechou !!!!

Browse pra ADO

Enviado: 15 Abr 2020 14:14
por Itamar M. Lins Jr.
Ola!
O ADO tem a opção FILTER() onde se passa uma expressão no formato ADO, parecida com SQL mas nem sempre igual.
Exemplo: oRs:Filter( "NOME LIKE 'JOS%' " )
SQLMIX tem todas as opções do DBF disponível.
Inclusive :

Código: Selecionar todos


index ... for temporary... "CDX/NTX"
...
 WHILE OrdWildSeek( '*' + cStrPes + '*', .T.)
      OrdKeyAdd('_TEMP_')
   END
...
            sb->(OrdScope(0,cNF+cModel))
            sb->(OrdScope(1,cNF+cModel))
Saudações,
Itamar M. Lins Jr.

Browse pra ADO

Enviado: 15 Abr 2020 14:24
por Itamar M. Lins Jr.
Ola!
Se HwGUI fizer isso, fica perfeito, pq no final das contas, independente da lib gráfica que vai fazer a "casca", o que realmente importa é manipular os dados, e se focar no WebService, ter um software consumindo corretamente uma instância de um banco de dados na nuvem, fechou !!!!
Só se tiver lá na cabeça dele, pq nunca vi ele mencionar nada.
Acesso para vários SGBD o Harbour já tem.
Tem nativo para MYSQL e PostgreSQL e a sintaxe particular de cada uma para manipular o resultset e o SQLMIX que usa sintaxe DBF para manipular o resultset.

O Browse da Hwgui trabalha com ARRAY e DBF. Não sei o que precisa mais. No caso é lógico que o que não temos é a IDE para fazer isso clicando e arrastando.
O Xailer está bem na frente da Hwgui.

Saudações,
Itamar M. Lins Jr.

Browse pra ADO

Enviado: 15 Abr 2020 14:43
por Itamar M. Lins Jr.
Ola!
Mas.... no SQLMIX quem trabalha é o Harbour, no ADO quem trabalha é o Windows.
Quem é mais rápido? o Harbour ou o Windows?
Quem aproveita melhor os recursos do Windows? o Harbour ou a Microsoft?
Isso que escreveu não tem lógica.
Quem faz qualquer coisa é o sistema operacional conversando com o CPU.
Pode o Harbour ser mais rápido e a probabilidade é grande, uma vez que não está condicionado ás entranhas do windows.
Igual ao descontinuado Activex...
Não esqueça de que ADO é uma tecnologia ultrapassada!

Código: Selecionar todos

A tecnologia ADO - ActiveX Data Objects - causou uma grande mudança no tratamento e acesso a fontes de dados pois trouxe muitas inovações que pretendiam otimizar e melhorar o desempenho. Muita coisa no entanto ficou somente no marketing. Com o crescimento da Web e de suas tecnologias criou-se uma grande demanda por aplicações distribuídas e escaláveis ; ficou evidente que a ADO tinha muitos problemas e que alguma coisa precisava ser feita.

Eis que surge então a tecnologia .NET e com ela , o que nos interessa no momento , uma nova maneira de acesso aos dados : ADO.NET. A primeira coisa que você deve fixar é que ADO.NET não é uma atualização da ADO. A tecnologia ADO se baseia no modelo COM - Component Object Model - e a ADO.NET tem seus pilares no XML e no acesso desconectado.
http://www.macoratti.net/ado_adon.htm

saudações,
Itamar M. Lins Jr.

Browse pra ADO

Enviado: 15 Abr 2020 15:02
por asimoes
Itamar M. Lins Jr. escreveu:Não esqueça de que ADO é uma tecnologia ultrapassada!
Sendo assim eu diria que dbf também está ultrapassado até antes do ado, assim como os hbnetio, letodbf e similares, então é melhor abandonar o harbour né?

Browse pra ADO

Enviado: 15 Abr 2020 15:16
por Itamar M. Lins Jr.
Ola!
Sendo assim eu diria que dbf também está ultrapassado até antes do ado, assim como os hbnetio, letodbf e similares, então é melhor abandonar o harbour né?
Vai distorcer assim lá longe...
Depende, o ADO tem dono. DBF é aberto, haja vista as ferramentas e empresas que ainda trabalham com ele.
ADO está dentro do windows e foi substituído pelo ADO.NET.
Quem disse que o Harbour só trabalha com DBF ?
Rapaz, sei não... para quê tanta polêmica... DBF dá forma tradicional está em desuso há muito tempo.
Por isso surgiu beeem antes ADS e aquele outro...CACHÉ. Os dois caríssimos por sinal. Porque usam o conceito de ATUALIZAÇÃO ATÔMICA! Alteração direto dentro do servidor..., depois surgiram NetIO, LetoDb[f]

Saudações,
Itamar M. Lins Jr.

Browse pra ADO

Enviado: 15 Abr 2020 15:22
por JoséQuintas
Itamar M. Lins Jr. escreveu:Não esqueça de que ADO é uma tecnologia ultrapassada!
Mais precisamente desde o Windows 7 Service Pack 1, a Microsoft declarou que o ADO era ultrapassado.

Ela alterou as chamadas pra 64 bits, pra funcionar no Microsoft Office 64 bits.
Mas isso quebrou a compatibilidade com Visual Basic 6.
Foi isso que ela alegou, pro pessoal do Visual Basic 6 passar pra VB.NET e usar ADO.NET.

ultrapassado, pra ninguém usar, mas a mudança foi pra ELA própria continuar usando....

Como não deu certo, depois lançou o pacote de compatibilidade, e tudo voltou ao normal.

Depois do Windows 7 veio o Windows 8, o Windows 10, e continua tudo funcionando.
Se Windows 10 é o último Windows.... então tem ADO pra muito tempo.

Porque matar o ADO, se ele não tá morto?
E o pessoal do XHarbour? Não tem SQLMIX, então ADO interessa.
E depois vão poder passar pra Harbour, continuando a usar o ADO.
Itamar M. Lins Jr. escreveu:Rapaz, sei não... para quê tanta polêmica...
Faça pra você mesmo a pergunta.
O usuário apenas quer uma solução para o problema dele, mas tá difícil dele obter com tanta discussão.