quarta-feira, 13 de abril de 2011

Conectar o Protheus a outra Base de Dados 2

Hoje irei detalhar melhor e passo a passo como podemos fazer uma integração entre o cadastro de clientes de um outro sistema e o sistema Protheus. A idéia é a seguinte:
Ter um JOB que perceba uma inclusão, alteração ou exclusão de um cliente no outro sistema e reflita isso para o Protheus. Nosso primeiro obstáculo é o banco de dados, pois nessa demonstração o sistema Protheus funciona com SQL Server e o sistema que será integrado usa o PostGress. Apesar disso, podemos conectar o Protheus ao banco do outro sistema e extrair as informações do cliente e tratá-las para inserir no cadastro. Vamos então realizar as configurações para que o Protheus tenha acesso a base de dados PostGre.

1)Baixe e instale o Drive ODBC no site http://www.postgresql.org/ftp/odbc/versions/msi/
2) Após instalar, crie a conexão ODBC no mesmo servidor aonde está configurada a ODBC do Protheus para o BD PostGre e teste a conexão.

3)Com a conexão OK é hora de criar o TOPConnect para a ODBC criada.

4)Valide a conexão.

alt=""id="BLOGGER_PHOTO_ID_5595066254285455986" />
















5) Para testar, podemos criar um pequeno Rdmake que irá na tabela do Postgre e trazer o nome do primeiro cliente cadastrado. Para visualizar melhor,abra a figura em uma nova guia.





Na próxima publicação eu irei mostrar como construir uma arquitetura de comunicação entre o Protheus e PostGre e assim deixar pronta a integração de clientes.

segunda-feira, 11 de abril de 2011

DbTree recursiva 2


Na última postagem falei sobre a DbTree baseada em uma única tabela mas que tem infinitas hierarquias. Hoje irei postar a estrutura da tabela e o código principal para poder gerar a árvore.
Primeiramente temos a estrutura da tabela, a qual chamei de ZRA. Eu a fiz para funcionar no Protheus mas ela pode ser usada para qualquer linguagem:

ZRA_COD -> Caracter tamanho 6. Irá guarda o ID único do registro.(Tem que ser auto-incremento. No caso do Protheus eu uso o GetSXEnum("ZRA","ZRA_COD") )

ZRA_DESCRI -> Caracter tamnho 20. Terá a descrição do registro.

ZRA_PAI -> Caracter tamanho 6. Irá guarda o ID único do nó pai. É extremamente importante que este campo tenha as mesmas características do campo ZRA_COD.

ZRA_ATIVO -> Caracter tamanho 1. Criei esse campo como um tipo de "flag" que terá a letra "S" se o nó estiver ativo e "N" caso não. Possibilita desativar um nó sem ter que exclui-lo.

ZRA_BMP1 -> Caracter de tamanho 10. Guarda o nome do ícone que o nó terá.

ZRA_BMP2 -> Caracter de tamanho 10. Guarda o nome do ícone que o nó terá quando estiver aberto, ou seja, exibindo os nós filhos.


ZRA_NIVEL -> Numérico. No caso do Protheus, esse campo será preenchido com 1 caso seja um nó raiz ou 2 caso seja um nó filho de outro nó.

A figura tenta ilustrar genericamente o algoritmo da função principal e abaixo o código em advpl.

Static Function LoadTree(lAt)
Local cATivo := iif(lAt,"S / N","S")
Local aGetArea := GetArea()



if(Empty(ZRA->ZRA_PAI))
Return
EndIf
oTree1:BeginUpdate()
if(AllTrim(ZRA->ZRA_PAI) == "000000" .and. Alltrim(ZRA->ZRA_ATIVO) $ cAtivo )

if(oTree1:Total()>0 .and. nContNo > 0)
oTree1:EndTree()
EndIf

if(! oTree1:TreeSeek(ZRA->ZRA_COD))
oTree1:AddTree(ZRA->ZRA_DESCRI + iif(Alltrim(ZRA->ZRA_ATIVO)=="N"," [DESATIVADO]","")+Space(24),.T.,"FOLDER5","FOLDER6",,,ZRA->ZRA_COD)
EndIf

Elseif(Alltrim(ZRA->ZRA_ATIVO) $ cAtivo)
if(! oTree1:TreeSeek(ZRA->ZRA_COD))
if oTree1:TreeSeek(ZRA->ZRA_PAI)
oTree1:AddItem(ZRA->ZRA_DESCRI + iif(Alltrim(ZRA->ZRA_ATIVO)=="N"," [DESATIVADO]","")+Space(24),ZRA->ZRA_COD,iif(Alltrim(ZRA->ZRA_ATIVO)=="N","F5_VERM","GEOTRECHO"),,,,2)
EndIf
EndIf

EndIf


nContNo++
ZRA->(DbSkip())
if(ZRA->(EOF()))
nContNo := 0
oTree1:EndTree()
RestArea(aGetArea)
oTree1:EndUpdate()
Return
EndIf
LoadTree(lShowDe)

Return

quinta-feira, 7 de abril de 2011

DbTree recursiva



O objeto Dbtree tem usos bem interessantes. Um dos que eu acho mais legal é a construção de uma estrutura DbTree baseada em uma única tabela e que pode conter infinitas hierarquias. O melhor é que a lógica pode ser usada não só para o componente usando na programação Advpl mas em outras linguagens. Já criei a mesma rotina em Visual Basic 6.0 como também no Access. A cima, um print da tela e em seguida outro print com as funções dos objetos contidos nela. Também coloquei um vídeo mostrando a rotina em funcionamento.
Na próxima publicação irei mostrar a estrutura da tabela e o algorítimo que realiza todas as funções.