Browse ADO/Array

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse ADO/Array

Mensagem por JoséQuintas »

Que p. é esta:
d:\github\harbour32>win-make clean install
! Building Harbour 3.2.0dev from source - https://harbour.github.io
! MAKE: win-make 4.1 sh.exe clean install
! HB_INSTALL_PREFIX: d:\harbour
! HB_BUILD_DYN: no
! HB_BUILD_CONTRIB_DYN: no
! HB_BUILD_SHARED: no
! HB_BUILD_STRIP: all
! HB_HOST_PLAT: win (x86_64) HB_SHELL: nt
! HB_PLATFORM: win (x86) (auto-detected)
! HB_COMPILER: mingw
...
gcc -I. -I../../../../../../include -Wmissing-braces -Wreturn-type -Wformat -Wimplicit-int -Wimplicit-function-declaration -O3 -fomit-frame-pointer -march=i586 -mtune=pentiumpro -DUNICODE -Id:/github/harbour32/src/3rd/zlib -DPNG_NO_STDIO -DPNG_ARM_NEON_OPT=0 -opng.o -c ../../../png.c
cc1.exe: error: CPU you selected does not support x86-64 instruction set
só tem pra 64 bits, é isso?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse ADO/Array

Mensagem por JoséQuintas »

E não adianta pular.

SET HB_WITH_PNG=no

Depois dá erro em JPEG, e outras.

Harbour 3.2 só gera 64 bits.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse ADO/Array

Mensagem por JoséQuintas »

Xi.... esquece....
test.png
test.png (6.64 KiB) Exibido 3092 vezes
Harbour nightly de hoje.
Mesmo problema.

Agora.... entendi direito isto?
Use o método GetRows para copiar registros de um conjunto de registros em uma matriz bidimensional. O primeiro subscrito identifica o campo e o segundo identifica o número do registro.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse ADO/Array

Mensagem por JoséQuintas »

Não vai de um jeito, vai de outro.
harbour.png

Código: Selecionar todos

PROCEDURE Main

   LOCAL oExcel, oRs, aRowList, aColList, xCol

   SetMode(25,80)
   CLS
   oExcel := ExcelConnection( "d:\temp\test.xls" )
   oExcel:Open()
   oRs := oExcel:Execute( "SELECT * FROM [planilha1$]" )
   aRowList := oRs:GetRows()
   oRs:Close()
   oExcel:Close()
   aRowList := InverseArray( aRowList )
   FOR EACH aColList IN aRowList
      ?
      FOR EACH xCol IN aColList
         ?? xCol
         ?? Space(3)
      NEXT
   NEXT
   ?
   ? hb_Version()

   Inkey(0)

   RETURN

FUNCTION InverseArray( a )

   LOCAL aNew, c, d

   aNew := Array( Len( a[ 1 ] ), Len( a ) )
   FOR EACH c IN a
      FOR EACH d IN c
         aNew[ d:__EnumIndex ][ c:__EnumIndex ] := d
      NEXT
   NEXT

   RETURN aNew

FUNCTION ExcelConnection( cFileName, cVersion )

   LOCAL oConexao

   DO CASE
   CASE ValType( cVersion ) == "C"
   CASE ".xlsx" $ Lower( cFileName ); cVersion := "12.0" // XLSX
   //CASE "t00" $ Lower( cFileName )  ; cVersion := "5.0"  // 95
   OTHERWISE                        ; cVersion := "8.0" // 97/2000/XP
   ENDCASE
   oConexao := win_OleCreateObject( "ADODB.Connection" )
   oConexao:ConnectionString := ;
      [Provider=Microsoft.ACE.OLEDB.12.0;Data Source=] + cFileName + ;
      [;Extended Properties="Excel ] + cVersion + [;HDR=YES";]

   RETURN oConexao

José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse ADO/Array

Mensagem por JoséQuintas »

Desculpem a confusão.

A definição da Microsoft diz que no ADO vém em ordem inversa.
Sendo assim, não há o que mexer no Harbour, porque o comportamento do GetRows() do ADO é esse mesmo.

É que a correção foi para corrigir a ordem no Excel, e achei que estava relacionada.
Agora fica até a dúvida se no Excel também é invertido.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Browse ADO/Array

Mensagem por gilbertosilverio »

Ola amigos,

Baseado neste exemplo, criei uma rotina para importar arquivos xls para meu sistema, mais hoje estou com um problema quando as colunas veem com números e alfanuméricos.

Tentei pelo valtype para poder diferenciar, mais nao sei e se padrao do ADO, mais ele formata a coluna sempre pela primeira passagem.

Como exemplo separei as colunas para ver os retornos, no caso essa coluna 34 onde esta o NUM, e que ocorre o erro.

Código: Selecionar todos

      oQuery := "SELECT * FROM [" +ALLTRIM(cABA_PEDI)+"$]"
      oExcel := ExcelConnection( @cFILE )
      oExcel:Open()
      oRs      := oExcel:Execute( oQUERY )
      aRowList := oRs:GetRows()
      oRs:Close()
      oExcel:Close()
      aRowList := InverseArray( aRowList )

      FOR EACH aColList IN aRowList
         AADD (aTUDO, [ ])
         C:=1
         FOR EACH xCol IN aColList
            IF C = 34
               IF valtype(xCOL) = [N]
                  AADD( aTUDO, STR(xCol,10) )
               ELSE
                  AADD( aTUDO, xCol )
               ENDIF
            ELSEIF valtype(xCOL) = [C]
               IF C = 08
                  AADD( aTUDO, VAL(xCol) )
               ELSEIF C = 42
                  AADD( aTUDO, VAL(RETIRAVIRGULA(xCol)) )
               ELSE
                  AADD( aTUDO, xCol )
               ENDIF
            ELSEif valtype(xCOL) = [N]
               IF C = 1
                  AADD( aTUDO, INT(xCol)  )
               ELSEIF C = 4
                  AADD( aTUDO, xCol  )
               ELSEIF C = 08
                  AADD( aTUDO, xCol  )
               ELSEIF C = 20
                  AADD( aTUDO, xCol  )
               ELSE
                  AADD( aTUDO, TRANSF(xCol, [@L])  )
               ENDIF
            ELSEIF valtype(xCOL) = [U]
               AADD(aTUDO, [ ])
            ELSE
               AADD(aTUDO, [ ])
            ENDIF
            C++
         NEXT
         AADD( aPEDIDO, aTUDO )
         aTUDO:={}
      NEXT
Quando no xls a coluna esta como GERAL, o ADO transforma ela em Numero. Ja tentei de tudo e nao consigo passar, somente manipulando a coluna para TEXTO, so que nao queria que o pessoal precisa-se fazer isso, pois sei que vao esquecer.

Alguma dica de como contornar este problema.

Grato.
Anexos
t1.png
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Browse ADO/Array

Mensagem por alxsts »

Olá!

Coloque o SQL para te ajudar. Faça ele formatar o retorno da forma que você precisa. Exemplo:

Código: Selecionar todos

oQuery := "SELECT cast(ie as char,20)), " + ;
          "       cast(desctinatario as char(50)), " + ;
          "       cast(endereco as char(50)), " + ;
          "       cast(num as char(5)), " + ;
          "       cast(cidade as char(50)), " + ;
          "       cast(estado as char(2)), " + ;
          "       cast(cep as char(15)) " + ;
          "  FROM " + ALLTRIM(cABA_PEDI)+"$]"
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Browse ADO/Array

Mensagem por JoséQuintas »

É por isso que eu prefiro usar minha lib igual fazia com DBF, e definir o tipo de retorno.

Código: Selecionar todos

METHOD GridSelection() CLASS JPTRANSACAOClass

   LOCAL oTBrowse, cnSQL := ADOClass():New( AppConexao() )

   WITH OBJECT cnSQL
      :cSQL := "SELECT IDTRANSACAO, TRNOME, TRREACAO FROM JPTRANSACAO ORDER BY TRNOME"
      :Execute()
      oTBrowse := { ;
         { "ID",        { || StrZero( :Number( "IDTRANSACAO" ), 6 ) } }, ;
         { "DESCRICAO", { || :String( "TRNOME", 25 ) } }, ;
         { "REACAO",    { || :String( "TRREACAO", 25 ) } } }
      BrowseADO( cnSQL, oTBrowse, "TRNOME", { || StrZero( :Number( "IDTRANSACAO" ), 6 ) } )
      :CloseRecordset()
   ENDWITH

   RETURN NIL
Digo exatamente como quero a leitura e formatação.
Em GUI precisaria adicionar o alinhamento de números à direita também.
Só não sei como indicaria as colunas do Excel, mas uma pesquisa rápida no google deve resolver.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Browse ADO/Array

Mensagem por gilbertosilverio »

Alexandre,

Obrigado, vou testar...
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Browse ADO/Array

Mensagem por Vlademiro »

No Excel, quando vc coloca uma Aspa simples antes do número força ele a ser interpretado como caractere e a Aspa não é exibida. É tipo um símbolo com significado especial.
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Browse ADO/Array

Mensagem por gilbertosilverio »

Alexandre,

Infelizmente, tentei de todas as maneiras, mais não funciona nem o cast nem o convert, da erro de execução...

Grato.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Browse ADO/Array

Mensagem por gilbertosilverio »

Ola amigos,

O segredo e aqui, deve-se usar IMEX=1 para dados mistos...

Código: Selecionar todos


      oConexao := win_OleCreateObject( "ADODB.Connection" )
      oConexao:ConnectionString := ;
            [Provider=Microsoft.ACE.OLEDB.12.0;Data Source=] + cFileName + ;
            [;Extended Properties="Excel ] + cVersion + [;HDR=YES;IMEX=1";]

Anexos
t1.png
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Browse ADO/Array

Mensagem por gilbertosilverio »

Ola amigos,

Como ficou a rotina:

Código: Selecionar todos

FUNCTION ExcelConnection( cFileName, cVersion )
   LOCAL oConexao
   DO CASE
   CASE ValType( cVersion ) == "C"
   CASE ".xlsx" $ Lower( cFileName ); cVersion := "12.0" // XLSX
   OTHERWISE                        ; cVersion := "8.0" // 97/2000/XP
   ENDCASE
   try
      oConexao := win_OleCreateObject( "ADODB.Connection" )
      oConexao:ConnectionString := ;
            [Provider=Microsoft.ACE.OLEDB.12.0;Data Source=] + cFileName + ;
            [;Extended Properties="Excel ] + cVersion + [;HDR=NO;IMEX=1";]

      /*  // sem cabecario
      oConexao:ConnectionString := ;
            [Provider=Microsoft.ACE.OLEDB.12.0;Data Source=] + cFileName + ;
            [;Extended Properties="Excel ] + cVersion + [;HDR=YES";]
      */

   catch
      hwg_msgstop([Erro na abertura do arquivo, por favor verifique],[Aviso do sistema])
      return nil
   endtry
RETURN oConexao

Código: Selecionar todos

Function teste_cast(cFILE, cFILE1)
   LOCAL oExcel, oRs, aRowList, aColList, xCol, aColLista, xColLis, xTAMA
   Private aPEDIDO:={}, aTUDO:={}, oQuery, aITENS :={}, TITULO:={}
   IF !EMPTY(aDESTINO)
      oQuery := "SELECT * FROM [" +ALLTRIM(cABA_PEDI)+"$]"
      oExcel  := ExcelConnection( @cFILE )
      oExcel:Open()
      oRs      := oExcel:Execute( oQUERY )
      aRowList := oRs:GetRows()
      oRs:Close()
      oExcel:Close()
      aRowList := InverseArray( aRowList )
      FOR EACH aColList IN aRowList
         FOR EACH xCol IN aColList
            IF valtype(xCOL) = [C]
               AADD( aTUDO, xCol )
            ELSEif valtype(xCOL) = [N]
               AADD( aTUDO, STR(xCol) )
            ELSEIF valtype(xCOL) = [U]
               AADD(aTUDO, [ ])
            ELSE
               AADD(aTUDO, [ ])
            ENDIF
         NEXT
         AADD( aPEDIDO, aTUDO )
         aTUDO:={}
      NEXT
      IF LEN(aPEDIDO) > 0
         FOR EACH aColLista IN aPEDIDO
             FOR EACH xCOLLIS IN aColLista
                 AADD( TITULO, xCOLLIS )  // MONTAR CABECARIO DO BROWSE
             NEXT
         NEXT
         xTAMA:=LEN(aPEDIDO)  // TIRAR O CABECARIO DA TABELA DEIXAR SOMENTE OS DADOS
         ADEL ( aPEDIDO, 1 )
         ASize( aPEDIDO, xTAMA-1 )
         BROWSE_ARRAY_EXCEL( @aPEDIDO, @TITULO )
      ELSE
         HWG_MSGINFO([nada])
      ENDIF
   ENDIF
RETURN NIL

Código: Selecionar todos

FUNCTION BROWSE_ARRAY_EXCEL( aMATA, aTITULO )
   LOCAL oDLG_MATRIZ, oPage1, aBr2, nI:=0

      INIT DIALOG oDLG_MATRIZ TITLE "Tabela EXCEL " AT 0,0 SIZE 1000, 600 ;
           FONT HFont():Add( 'tahoma', 0, -13, 400,,,) STYLE WS_CAPTION+DS_CENTER

      @ 10,30 BROWSE aBr2 ARRAY SIZE oDLG_MATRIZ:nWidth-30, oDLG_MATRIZ:nHeight-100 ;
              STYLE WS_TABSTOP+WS_HSCROLL FONT HFont():Add( 'tahoma', 0, -13, 400,,,)

      aBr2:aArray := aMATA

      Hwg_CreateArList( aBr2, aMATA )

      aBr2:lESC      := .T.
      aBr2:lAdjRight := .T.

      FOR nI := 1 TO Len(aBr2:aColumns)
         aBr2:aColumns[nI]:heading   := aTITULO[nI]
         IF (aBr2:aColumns[nI]):Type == "C"
            aBr2:aColumns[nI]:nJusHead  := DT_LEFT
            aBr2:aColumns[nI]:Length    := LEN(aTITULO[nI])+10
         ELSE
            aBr2:aColumns[nI]:nJusHead  := DT_LEFT
            aBr2:aColumns[nI]:Length    := 15
         ENDIF
         IF (aBr2:aColumns[nI]):Type == "C"
            aBr2:aColumns[nI]:nJusLin   := DT_LEFT
            aBr2:aColumns[nI]:Picture   := [@!]
         ELSEIF (aBr2:aColumns[nI]):Type == "N"
            aBr2:aColumns[nI]:nJusLin   := DT_RIGHT
            aBr2:aColumns[nI]:Picture   := [@E 999,999,999.99]
         ENDIF
      NEXT

      FOR nG := 1 TO Len(aBr2:aColumns)
          aBr2:aColumns[nG]:bColorFoot := {|ng| {x_BLUE, x_YELLOW} }
      NEXT

      @ oDLG_MATRIZ:nWidth-130,oDLG_MATRIZ:nHeight-55 BUTTONEX "Sai&r"   SIZE 120,38 STYLE WS_TABSTOP ;
                                                      ON CLICK {|| oDLG_MATRIZ:CLOSE()  }

   ACTIVATE DIALOG oDLG_MATRIZ

RETURN(.T.)

GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Responder