Página 1 de 1

Possivel incopatibilidade CreateObject harbour x xHarbour

Enviado: 12 Fev 2019 16:06
por ivanil.marcelino
Boa tarde Colegas,
Estou tentando migrar do xharbour para o harbour e estou com o seguinte problema:
Atualmente uso o ADOdb invocado pela Função CreateObject.

Ocorre que aplicada a consulta abaixo no Xharbour, retorna resultado, se vou diretamente no Access e executo internamente também retorna, no entanto no Harbour nada retorna.

Select Texto from Formularios where cod in(0,12) and codigo= 68 and validade=#2019-02-12 10:57:02#


O campo validade é do tipo datetime, quando a consulta é apenas uma data #9999-12-31# cheia sem o horário funciona nos três sistemas, com horário funciona apenas no xharbour e no próprio Access.

Alguém por acaso faz uso de consulta utilizando um campo datetime no harbour e o faz com sucesso?

Versão do harbour: Harbour 3.2.0dev (r1901151150)
Compilador: MinGW GNU C 8.1 (32-bit)

o xHarbour está compilado com o Borland 5.5


Grato

Ivanil

Possivel incopatibilidade CreateObject harbour x xHarbour

Enviado: 12 Fev 2019 20:42
por JoséQuintas
Sinceramente... me admira funcionar no XHarbour kkkkk

Código: Selecionar todos

cn := win_OleCreateObject( "ADODB.Connection" )
cn:ConnectionString := "....."

Rs := cn:Execute( "SELECT ...." )
DO WHILE ! Rs:Eof()
   ? rs:Fields( "CAMPODATA" ):Value
   rs:MoveNext()
ENDDO
rs:Close()
cn:Close()
Só a título de curiosidade, não significa problema, mas esse Harbour não é oficial. mingw 8.1 não é usado oficialmente nem no Harbour 3.4.
Aqui eu uso Harbour 3.4 com mingw 8.1, mas oficialmente não chegou a essa versão de mingw.
Como eu disse, é apenas pra curiosidade. Uso faz tempo e não tenho problema com isso.

Possivel incopatibilidade CreateObject harbour x xHarbour

Enviado: 12 Fev 2019 21:14
por ivanil.marcelino
Pois é meu amigo,

Mas veja bem, este exemplo que postaste não é o problema, o problema esta no retorno da consulta, para fazer funcionar aqui tive alterar o final da consulta de:

Select Texto from Formularios where cod in(0,12) and codigo= 68 and validade=#2019-02-12 10:57:02#

para

Select Texto from Formularios where cod in(0,12) and codigo= 68 and validade>#2019-02-12 10:57:01# and and validade<#2019-02-12 10:57:03# assim funcionou normal, mas quando alguém de fora lê um código assim, minha orelha deve queimar...

Eu estava usando o CreateObject diretamente, acredito que seja o mesmo win_createObject, mas vou trocar e ver o resultado.

Grato

Ivanil

Possivel incopatibilidade CreateObject harbour x xHarbour

Enviado: 13 Fev 2019 00:56
por JoséQuintas
Numa pesquisa no google:

Código: Selecionar todos

SELECT * FROM 
data 
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC

Possivel incopatibilidade CreateObject harbour x xHarbour

Enviado: 13 Fev 2019 02:41
por ivanil.marcelino
Vou postar um código, quem puder testar de repente é algo apenas em conflito de versões, como o amigo Quintas já mencionou.

Código: Selecionar todos

Function Main
   Local cSQL,rs,i:=0
   Local cn:=win_OleCreateObject("ADODB.Connection")
   Local cx:=win_OleCreateObject("ADOX.Catalog")
   cx:Create("Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;Data Source=c:\temp\teste.mdb")
   cn:ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\teste.mdb"
   cn:open()
   cSQL:="CREATE TABLE Formularios("+;
          "codigo Int not Null,"+;
          "Validade SmallDateTime not Null,"+;
          "CONSTRAINT PK_Formularios Primary Key (codigo))"
   cn:Execute(cSQL)
   cn:Execute("insert into Formularios (codigo,validade) values (1,'2019-02-12 01:52:01');")
   cn:Execute("insert into Formularios (codigo,validade) values (2,'2019-02-12 01:52:02');")
   cn:Execute("insert into Formularios (codigo,validade) values (3,'2019-02-12 01:52:03');")
   rs:=cn:Execute("Select * from Formularios")
   While !Rs:Eof()
      ?(str(rs:Fields["codigo"]:value,3)+cSTR(rs:fields["validade"]:value))
      rs:moveNext()
   enddo

   //Em harbour nao encontra...porém tanto xharbour como o próprio access encontra normalmente
   rs:=cn:Execute("Select validade from formularios where validade=#2019-02-12 01:5:02#")
   if rs:Eof()
      Alert("Nada encontrado...")
   else
      alert(cStr(rs:Fields[0]:value))
   endif

   //única forma de harbour encontrar, usando um intervalo...
   rs:=cn:Execute("Select validade from formularios where validade >#2019-02-12 01:52:01# and validade<#2019-02-12 01:52:03#")

   if rs:Eof()
      Alert("Nada encontrado...")
   else
      alert(cStr(rs:Fields[0]:value))
   endif
   
   While !Rs:Eof()
      i++
      rs:Movenext()
   enddo
   alert("encontrado "+str(i)+" vezes")
   cn:close()
Return .t.