Armazenar imagens em um .DBF.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Armazenar imagens em um .DBF.

Mensagem por Linguagemclipper »

Linguagemclipper escreveu:HB_Base64EncodeFile( cARQBMP, "base64bmp.enc" )
Isso aqui faz o que? Grava em arquivo.
Memoread faz o que mesmo? Lê um arquivo, né?
Onde está o erro?

Antes de sair esculhambando o código do cara e chamá-lo de principiante tenham ao menos a dignidade de compilar o código no computador primeiro pra ter certeza.
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Armazenar imagens em um .DBF.

Mensagem por JoséQuintas »

Demorou dois meses pra ler as respostas, e mesmo assim interpreta errado ?
ERRO DE PRINCIPIANTE é um termo usado quando se trata de um erro básico.
Tem que explicar português também além de programação ?
teste.png
teste.png (11.17 KiB) Exibido 1247 vezes
Olhe aí.
Esse é o resultado do seu "erro de principiante", nem é necessário compilar.
Linguagemclipper escreveu:A questão é que não está funcionando com o servidor de banco de dados LetoDBf. Se ele lê o arquivo numa variável então porque não salva no DBF lá no servidor se o conteúdo está na memória?
Linguagemclipper escreveu:Antes de sair esculhambando o código do cara e chamá-lo de principiante tenham ao menos a dignidade de compilar o código no computador primeiro pra ter certeza.
Alguém aí a fim de compilar letodbf, instalar no computador, e fazer o teste ?
Vão ser só alguns dias pra fazer isso, ou semanas, ou meses....

Agora é analisar sobre o que considerar falta de dignidade.
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
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Armazenar imagens em um .DBF.

Mensagem por alaminojunior »

Sai um pouco fora do escopo, mas talvez sirva de ajuda.
Detalhe: Banco MySQL, campo MediumBlob

Salvando conteúdo do JPG no banco.

Código: Selecionar todos

h3:= fopen(xxarq)
htam:= fseek(h3,0,2)
fseek(h3,0,0)
h4:= space(htam)
fread( h3, @h4, htam )
fclose( h3 )
h4 = HB_Base64Encode( h4, htam )   
cSql:= 'update p0001 set img = ' + sr_cdbvalue(h4) + ' where cod = ' + sr_cdbvalue(p0001->cod)
oSql:Execute( cSql, .t. )
oSql:Commit()
Restaurando do banco.

Código: Selecionar todos

cSql:= 'select img from p0001 where cod='+sr_cdbvalue(xCod)
oSql:Exec( cSql, .t., .t., @aJPG )
sJPG:= { HB_Base64Decode( aJPG[1,1] ) }
hJPG:= fcreate(".\swap\"+alltrim(Cstr(xCod))+'.jpg',0)
fwrite(hJPG, sJPG[1] )
fclose(hJPG) 
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Armazenar imagens em um .DBF.

Mensagem por Linguagemclipper »

JoséQuintas escreveu:Demorou dois meses pra ler as respostas, e mesmo assim interpreta errado ?
ERRO DE PRINCIPIANTE é um termo usado quando se trata de um erro básico.
Tem que explicar português também além de programação ?
teste.png
Olhe aí.
Esse é o resultado do seu "erro de principiante", nem é necessário compilar.
Linguagemclipper escreveu:A questão é que não está funcionando com o servidor de banco de dados LetoDBf. Se ele lê o arquivo numa variável então porque não salva no DBF lá no servidor se o conteúdo está na memória?
Linguagemclipper escreveu:Antes de sair esculhambando o código do cara e chamá-lo de principiante tenham ao menos a dignidade de compilar o código no computador primeiro pra ter certeza.
Alguém aí a fim de compilar letodbf, instalar no computador, e fazer o teste ?
Vão ser só alguns dias pra fazer isso, ou semanas, ou meses....

Agora é analisar sobre o que considerar falta de dignidade.
Primeiro que não tem nada a ver tua imagem de exemplo com a história do Brasil. Cara, tu veio me ensinar o que é erro básico? É sério? rá rá rá. Tem nada que preste para falar não?!
Segundo, meu código referente à pergunta não tem LetoDBf nenhum. Só baixar o PRG para ver que ele executa e funciona, só vai precisar instalar o LetoDBf se quiser descobrir por que usando ele não funciona que é o que eu quero saber, mas a pergunta foi para quem já teve essa experiência para compartilhar, não estou pedindo pra ninguém trabalhar pra mim não! Se não sabe fica quieto, se quiser descobrir vá até o fim!
Terceiro, mais uma vez e como sempre Itamar veio esculhambando o meu código e você também. Tenho mais de 35 anos que conheço Clipper e vocês me chamando de principiante... só podem estar se achando! Vocês sabem tudo, né? Pergunta nada, só estão aqui pra ajudar os principiantes, né?
Quintas, tu é tão arrogante que já ví tópicos gigantes aqui no forum tu perguntando e respondendo pra si mesmo em loop infinito... rs. Tu quase nunca pergunta, mas quando pergunta só você mesmo pode responder... rá rá rá.

Vamos ser mais humildes, tá? Vem falar besteira pra mim não porque vai ler o que não quer também!
São tão sabidos que não ajudaram em nada, nem sequer para observar que o código funciona, ainda diz que tem erro... certo são vocês, errado está a máquina.

O código que postei aí grava imagem em campo memo no DBF e restaura. Quem quiser é só baixar que funciona. Só deu problema ao usar com LetoDBf porque o DBF está no servidor e o arquivo na máquina local. Como ninguém precisou fazer isso antes então ninguém sabe.
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Armazenar imagens em um .DBF.

Mensagem por JoséQuintas »

Linguagemclipper escreveu:Primeiro que não tem nada a ver tua imagem de exemplo com a história do Brasil. Cara, tu veio me ensinar o que é erro básico? É sério? rá rá rá. Tem nada que preste para falar não?!
É um erro do seu fonte, comparar string usando "="
Não viu não ?
Linguagemclipper escreveu:O código que postei aí grava imagem em campo memo no DBF e restaura. Quem quiser é só baixar que funciona.
Mencionou erro daqui, erro dali, mas agora diz que funciona.
Nem faz diferença o erro mostrado.
Ok.
Resolvido então.

Só não entendo porque tanta estupidez.
Fica visível que a estupidez falou mais alto, porque nem sequer percebeu que postaram coisa errada.
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
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Armazenar imagens em um .DBF.

Mensagem por Itamar M. Lins Jr. »

Olá!
Realmente não tem problema com seu código.(anexo)
Eu não tinha baixado o anexo... Vi apenas os que estavam postado na tela.
Fiquei sem entender com havia postado. De onde estava lendo os BMP ? Se da estação ou do servidor. Mas isso é outro assunto.
Seu código não compila usando o Harbour. PQ tem uma função especifica do xHarbour. Conforme "alxsts" tinha mostrado.
Convém vc mandar o BUG para o Elch(LetoDBf) e aguardar a correção.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Armazenar imagens em um .DBF.

Mensagem por Linguagemclipper »

Aí sim, Itamar! Ok
Aí não, Quintas, só respondí no mesmo embalo da música que colocaram pra tocar, não venha me chamar de estúpido não! Na próxima toque um gospel ou desligue o som, blz? Tu é bom de metáfora, né? Acho que tu é bom em tudo, só falta delicadeza.

Itamar, como a função busca o arquivo em um PATH enquanto ele está em um endereço IP, no servidor de banco de dados, então não acha. Por isso que pensei em gravá-lo dentro do banco de dados lá no servidor e depois recuperá-lo localmente na pasta do sistema caso ele não exista, mas o campo não enxerga a variável.
Se ninguém nunca passou por isso, tudo bem. Quando eu puder eu farei mais testes.
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Armazenar imagens em um .DBF.

Mensagem por Itamar M. Lins Jr. »

Olá!
Essa parte pra mim está errada, mas como está ok ai. Vai entender...
Aqui joga para uma variavel; base64bmp.enc -> HB_Base64EncodeFile( cARQBMP, "BASE64BMP.ENC" )

Aqui grava no DBF; BMP->ARQUIVO := MEMOREAD("BASE64BMP.ENC") // -> tá lendo do disco ? Ou está na memoria ?

Tá lendo de qual pasta no disco ? se o path c:\meu_sistema\ etc... não tem como saber!

Na minha opinião deveria ser: -> BMP->ARQUIVO := BASE64BMP.ENC //Também não sei pq da extensão(ENC) se é um "conteúdo"

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Armazenar imagens em um .DBF.

Mensagem por Itamar M. Lins Jr. »

Olá!
Ok já vi que ele lê e grava o arquivo em disco( HB_Base64EncodeFile() ). Codificado em base64!
Vai ficar o HD cheio de arquivos em base64 gravados ?
Então vc precisa saber se memoread está de fato lendo o arquivo.

Código: Selecionar todos

IF FILE(cARQBMP)
	HB_Base64EncodeFile( cARQBMP, "BASE64BMP.ENC" ) //Aqui base64bmp.enc tá gravado em qual lugar(pasta) ?
	BMP->(DBAPPEND())
	BMP->IMAGEM  := cARQBMP
	BMP->ARQUIVO := MEMOREAD("BASE64BMP.ENC")
	BMP->(DBCOMMIT())
	
	? "OK"
ENDIF

Código: Selecionar todos

IF file("BASE64BMP.ENC") 
 cBitMap := memoread(...
ELSE
 alert("cadê o arquiv...")...
ENDIF
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Armazenar imagens em um .DBF.

Mensagem por Itamar M. Lins Jr. »

Olá!
Outro detalhe, que foi explicado aqui no forum.

Código: Selecionar todos

MEMOWRIT("MEMO.BMP", HB_base64decode(BMP->ARQUIVO) )
Vai detonar o arquivo "MEMO.BMP" pq MEMOWRIT() vai grava CTRL+"Z" no final do BMP.
Não testei nada disso, mas conforme explicado, tem um terceiro parâmetro que precisa passar para não fazer isso.
Dai a falha ao ler o BMP.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Armazenar imagens em um .DBF.

Mensagem por Linguagemclipper »

É assim: preciso do logotipo da empresa para imprimir nos relatórios. Esse logotipo é lido com o WIN32_BMP() que busca o arquivo na mesma pasta do sistema ou em um path que o cara tenha colocado no campo dbf caso ele tenha posto path+arquivo nesse campo.
O logotipo ficou junto dos DBFs no servidor. Posso instalar o EXE em qualquer máquina, mas vai faltar o bitmap. Se o programa enxergar um nome de bitmap no DBF ele tenta achá-lo, mas como não acha o logotipo não aparece. Daí, no momento em que a pessoa coloca o [caminho]nome do bitmap lá no campo do DBF ele já lê o bitmap e o converte em base64 (que é uma string) e consigo gravar no campo memo. Depois eu consigo ler o campo memo e gravar ele na pasta do sistema com memowrit, caso não exista (não vai ficar um monte de bitmap lá). É verdade que o arquivo fica ligeiramente modificado, 1byte na verdade, mas não afeta, é possível ler ele normalmente.
Acho que deve ter um jeito melhor, mas foi o que eu conseguí pensar no momento.
Preciso descobrir como chamar o EXE dentro do servidor Linux onde roda o LetoDBF, atualizar ele para novas versões, etc. Dá certo sem ele, faço tudo isso colocando os DBFs e o executável numa pasta mapeada na rede Windows porque em cada máquina tem apenas o atalho do programa, então quando atualiza vai pra todos. Tenho um minúsculo arquivo EXE feito em C# que chama meu sistema, os atalhos são para ele, daí não tem problema na atualização porque ele vai começar a chamar o EXE atualizado... pode ter maneiras melhores, mas foi o que conseguí criar.
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Armazenar imagens em um .DBF.

Mensagem por rochinha »

Amiguinhos,

Veja se ajuda

Fiz isto usando campos memos e arquivos .JPG/.PNG

Use assim no lugar de MemoWrit():

Código: Selecionar todos

/*
 * Minha funcao de gravacao de arquivo sem o lixo do comando padrao
 */
FUNCTION rMemoWrit( _aquivo_, _conteudo_ ) 
   nHandle := fCreate( _aquivo_ )
   fWrite( nHandle, _conteudo_, LEN( _conteudo_ ) )
   fClose( nHandle )
   return .t.
Não use BMP, a não ser que o seu controle visual só esteja preparado para este MIME.

Código: Selecionar todos

DLL32 FUNCTION SaveToJpg( hWnd AS LONG, cFileName AS STRING, nWidth AS LONG, nHeight AS LONG ) AS LONG PASCAL ;
      FROM "SaveToJpgEx" LIB "JPG.DLL"
DLL32 FUNCTION BmpToJpg( BmpFile AS STRING, JpgFile AS STRING ) AS LONG PASCAL ;
      FROM "BmpToJpg" LIB "JPG.DLL"
Download da JPG.DLL

Aquela velha funçãozinha que limpa o caracter Filho da Mãe que ferra nossa vida. hbHardCR( MemoRead(...) )

Código: Selecionar todos

Function hbHardCR( oque )
	   return CharRem( chr(13), CharRem( chr(10), oque ) )
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder