Página 2 de 2
Browse ADO/Array
Enviado: 14 Ago 2020 22:40
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?
Browse ADO/Array
Enviado: 14 Ago 2020 22:54
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.
Browse ADO/Array
Enviado: 14 Ago 2020 23:03
por JoséQuintas
Xi.... esquece....

- test.png (6.64 KiB) Exibido 3102 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.
Browse ADO/Array
Enviado: 15 Ago 2020 00:58
por JoséQuintas
Não vai de um jeito, vai de outro.

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
Browse ADO/Array
Enviado: 15 Ago 2020 19:12
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.
Browse ADO/Array
Enviado: 21 Out 2020 07:26
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.
Browse ADO/Array
Enviado: 21 Out 2020 13:44
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)+"$]"
Browse ADO/Array
Enviado: 21 Out 2020 14:57
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.
Browse ADO/Array
Enviado: 21 Out 2020 15:09
por gilbertosilverio
Alexandre,
Obrigado, vou testar...
Browse ADO/Array
Enviado: 21 Out 2020 16:30
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.
Browse ADO/Array
Enviado: 22 Out 2020 14:29
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.
Browse ADO/Array
Enviado: 22 Out 2020 15:43
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";]
Browse ADO/Array
Enviado: 23 Out 2020 07:37
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.)