Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

BlackTDN :: PROTHEUS_REPOSIT

Em função de uma dúvida levantada por Marcelo Sanches(*) e a uma ajuda à minha amiga Priscila Castro na verificação de problemas de impressão do logo na Ficha de Registro, descobri, recente e acidentalmente, que é possível armazenar as imagens do SIGAADV.BMD no SGBD/DBMS.
(*)
Existe uma forma de conseguir acessar imagens armazenadas em SGBD em formato binário através do Protheus e exibi-las em tela como imagens, por exemplo, na tabela SB1?
Por motivos de segurança a empresa em que eu trabalho não quer mais armazenar os arquivos JPEG numa pasta no servidor, como é hoje, no repositório de imagens e sim no SGBD.
Você tem algum "case" estudado para isso?
Abraços,
Sanches
De fato a implementação dessa alteração é muito simples.
Basta incluir a chave RepositInDataBase=1 no .ini do Protheus Server essa chave trabalha em conjunto com o parâmetro MV_REPOSIT (Indica o tipo de armazenamento do repositório de  imagens. 1=Genérico, 2=Por modulo, 3=Especifico).
MV_REPOSIT (Conteúdo) MV_REPOSIT (Descrição)
Ao fazer isso o sistema irá criar a tabela PROTHEUS_REPOSIT no SGBD com as seguintes colunas: BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,MEMO,D_E_L_E_T_,R_E_C_N_O_.
A carga das informações contidas no arquivo SIGAADV.BMD é feita automaticamente a partir da primeira manutenção na tabela e, em função disso, recomendo que a modificação seja feita quando ninguém estiver utilizando o sistema.
O Protheus irá armazenar as informações da seguinte forma:
PROTHEUS_REPOSIT
Recuperando-as utilizando as seguintes instruções obtidas a partir do dbAccess.
tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ?

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 2 )

tDBServer::GoTo -- Goto 2 on Table PROTHEUS_REPOSIT [OK]

tMSSQLConnection::SetRowCount SET ROWCOUNT 40

tISAMFile::GoTop SELECT R_E_C_N_O_ FROM dbo.PROTHEUS_REPOSIT WHERE D_E_L_E_T_ = ' ' ORDER BY BMPNAME,ALIAS,SEQ,R_E_C_N_O_

tISAMFile::GoTop -- Load [19] record(s) to IsamCache

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 1 )

tDBServer::First -- First Recno 1 on Table PROTHEUS_REPOSIT [OK]

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 1

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 2 )

tDBServer::Skip -- End Skip to 2

tDBServer::BlobRead -- BLOB Read on PROTHEUS_REPOSIT Id 6 Recno 0 Length 0

tODBCStatement::GetBlob SELECT MEMO FROM PROTHEUS_REPOSIT WHERE R_E_C_N_O_ = 2

tDBServer::BlobRead -- BLOB Read on PROTHEUS_REPOSIT Id 6 Recno 2 Length 65001

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 2

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 3 )

tDBServer::Skip -- End Skip to 3

tDBServer::BlobRead -- BLOB Read on PROTHEUS_REPOSIT Id 6 Recno 0 Length 0

tODBCStatement::GetBlob SELECT MEMO FROM PROTHEUS_REPOSIT WHERE R_E_C_N_O_ = 3

tDBServer::BlobRead -- BLOB Read on PROTHEUS_REPOSIT Id 6 Recno 3 Length 5615

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 3

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 4 )

tDBServer::Skip -- End Skip to 4

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 4

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 5 )

tDBServer::Skip -- End Skip to 5

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 5

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 6 )

tDBServer::Skip -- End Skip to 6

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 6

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 7 )

tDBServer::Skip -- End Skip to 7

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 7

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 8 )

tDBServer::Skip -- End Skip to 8

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 8

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 9 )

tDBServer::Skip -- End Skip to 9

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 9

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 10 )

tDBServer::Skip -- End Skip to 10

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 10

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 11 )

tDBServer::Skip -- End Skip to 11

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 11

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 12 )

tDBServer::Skip -- End Skip to 12

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 12

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 13 )

tDBServer::Skip -- End Skip to 13

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 13

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 14 )

tDBServer::Skip -- End Skip to 14

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 14

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 15 )

tDBServer::Skip -- End Skip to 15

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 15

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 16 )

tDBServer::Skip -- End Skip to 16

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 16

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 17 )

tDBServer::Skip -- End Skip to 17

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 17

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 18 )

tDBServer::Skip -- End Skip to 18

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 18

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 19 )

tDBServer::Skip -- End Skip to 19

tDBServer::Skip -- Begin Skip File PROTHEUS_REPOSIT ID 15 Count 1 From Record 19

tDBServer::Skip -- End Skip - [NO_RECORD_FOUND] [EOF]

tISAMFile::OpenCurrentRecord SELECT BMPNAME,ALIAS,SEQ,BMPSIZE,MODULO,TBL.D_E_L_E_T_ FROM dbo.PROTHEUS_REPOSIT TBL WHERE TBL.R_E_C_N_O_ = ? -- ( R = 2 )

tDBServer::GoTo -- Goto 2 on Table PROTHEUS_REPOSIT [OK]

[]s
иαldσ dj

Comentários

  1. Naldo você é incrível! Não sei se você tem noção do tamanho da ajuda que você nos proporciona...
    Eu preciso exatamente disto, guardar imagens no BD (fotos) e, aproveitando da sua boa vontade, existe alguma função no Protheus para que eu visualize a imagem?

    ResponderExcluir
    Respostas
    1. Utilize a classe TBmpRep : Classe responsável pela manipulação (inserção, alteração, exclusão e visualização) do repositório de imagens.

      http://tdn.totvs.com.br/display/public/mp/TBmpRep

      Excluir
  2. Naldo é possível usar o repositório de imagens com uma tabela customizada, usando a classe TBmpRep para recuperar as imagens e gravá-las no SGBD diretamente ?

    ResponderExcluir
  3. Naldo!!
    Obrigada pela ajuda de sempre!!

    Abs,

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA