Clipper On Line • Ver Tópico - Browse ADO/Array

Browse ADO/Array

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Browse ADO/Array

Mensagempor JoséQuintas » 14 Ago 2020 22:40

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, 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Browse ADO/Array

Mensagempor JoséQuintas » 14 Ago 2020 22:54

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, 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Browse ADO/Array

Mensagempor JoséQuintas » 14 Ago 2020 23:03

Xi.... esquece....

test.png
test.png (6.64 KiB) Visualizado 1978 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, 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Browse ADO/Array

Mensagempor JoséQuintas » 15 Ago 2020 00:58

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

harbour.png


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, 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Browse ADO/Array

Mensagempor JoséQuintas » 15 Ago 2020 19:12

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, 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Browse ADO/Array

Mensagempor gilbertosilverio » 21 Out 2020 07:26

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.

      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
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Browse ADO/Array

Mensagempor alxsts » 21 Out 2020 13:44

Olá!

Coloque o SQL para te ajudar. Faça ele formatar o retorno da forma que você precisa. Exemplo:
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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Browse ADO/Array

Mensagempor JoséQuintas » 21 Out 2020 14:57

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

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, 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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Browse ADO/Array

Mensagempor gilbertosilverio » 21 Out 2020 15:09

Alexandre,

Obrigado, vou testar...
gilbertosilverio
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Browse ADO/Array

Mensagempor Vlademiro » 21 Out 2020 16:30

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.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Browse ADO/Array

Mensagempor gilbertosilverio » 22 Out 2020 14:29

Alexandre,

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

Grato.
gilbertosilverio
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Browse ADO/Array

Mensagempor gilbertosilverio » 22 Out 2020 15:43

Ola amigos,

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


      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
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Browse ADO/Array

Mensagempor gilbertosilverio » 23 Out 2020 07:37

Ola amigos,

Como ficou a rotina:

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



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


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
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Anterior



Retornar para HwGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 2 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