Clipper On Line • Ver Tópico - Browse com ADO

Browse com ADO

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Browse com ADO

Mensagempor Fernando queiroz » 18 Mar 2020 14:28

Dando uma melhorada na QUERY de filtragem, ficou muito show

*************************************************************************************************************
STATIC FUNCTION FILTROLOGGERAL( oServer, nCODPRO, dDatepicker1, dDatepicker2, lEntradas , lSaidas)
*************************************************************************************************************
LOCAL aResult:={};
   , oQuery;
   , cQuery

   cQuery := "SELECT LOGGERAL_NUMNOT, ";
               + "LOGGERAL_CODPRO, ";
               + "LOGGERAL_DATMOV, ";
               + "LOGGERAL_CODVEN, ";
               + "LOGGERAL_CLIFOR, ";
               + "LOGGERAL_QUANT, ";
               + "LOGGERAL_VALUNI, ";
               + "LOGGERAL_OPERADOR, ";
               + "CASE WHEN LOGGERAL_TIPMOV IS TRUE THEN 'ENTRADA' ELSE 'SAIDA' END AS STATUS_TIPO ";
               
               IF nCODPRO # 0
                  cQuery += "from loggeral WHERE LOGGERAL_CODPRO = '" + STRZERO(nCODPRO,7,0) + "' AND "
               ELSE
                  cQuery += "from loggeral WHERE "
               ENDIF
               
               cQuery  += "LOGGERAL_DATMOV BETWEEN " ;
                     + "'" + STRZERO(YEAR(dDatepicker1),4,0) + "-" + STRZERO(MONTH(dDatepicker1),2,0) + "-" + STRZERO(DAY(dDatepicker1),2,0) + "'";
                     + " AND ";
                     + "'" + STRZERO(YEAR(dDatepicker2),4,0) + "-" + STRZERO(MONTH(dDatepicker2),2,0) + "-" + STRZERO(DAY(dDatepicker2),2,0) + "'"
         
               IF lEntradas .AND. ! lSaidas
                  cQuery += " AND LOGGERAL_TIPMOV IS TRUE "
               ELSEIF ! lEntradas .AND. lSaidas
                  cQuery += " AND LOGGERAL_TIPMOV IS FALSE "
               ENDIF
               
//               hwg_MsgInfo( cQuery,"QUERY" )
                        
   oQuery := oServer:Execute(cQuery)

   DO WHILE ! oQuery:Eof()
      aAdd( aResult, {oQuery:Fields( "LOGGERAL_NUMNOT" ):Value,;
                  oQuery:Fields( "LOGGERAL_CODPRO" ):Value,;
                  oQuery:Fields( "LOGGERAL_DATMOV" ):Value,;
                  oQuery:Fields( "STATUS_TIPO" ):Value,;
                  oQuery:Fields( "LOGGERAL_CODVEN" ):Value,;
                  oQuery:Fields( "LOGGERAL_CLIFOR" ):Value,;
                  oQuery:Fields( "LOGGERAL_QUANT" ):Value,;
                  oQuery:Fields( "LOGGERAL_VALUNI" ):Value,;
                  oQuery:Fields( "LOGGERAL_OPERADOR" ):Value} )

      oQuery:MoveNext()
   ENDDO
   oQuery:Close()

RETURN aResult


resultado

tela.jpg
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

Browse com ADO

Mensagempor gilbertosilverio » 18 Mar 2020 14:43

Fernando,

Estava vendo teu codigo, e pelo que entendi, voce trabalha com MARIADB e DBF, pela chamada que voce faz na consulta de produtos correto?

Da pra trabalhar com duas base de dados?
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 com ADO

Mensagempor Fernando queiroz » 18 Mar 2020 15:19

gilbertosilverio escreveu:Fernando,

Estava vendo teu codigo, e pelo que entendi, voce trabalha com MARIADB e DBF, pela chamada que voce faz na consulta de produtos correto?

Da pra trabalhar com duas base de dados?


pode sim , sem problemas

na realidade estou trabalhando com o LETODBF e MARIADB

mas ja converti todos os arquivos DBF em MARIADB

e agora estou brincando com os dois, e no futuro migrar tudo, to fazendo que nem o QUINTAS vamos brincar e aprender e depois migrar
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

Browse com ADO

Mensagempor Fernando queiroz » 23 Mar 2020 16:04

Fonte completo de uma rotina de CONSULTA, INCLUSÃO , EXCLUSÃO, ALTERAÇÃO em MARIADB

Gostaria da ajuda dos amigos para umas dicas de como posicionar novamente no mesmo registro do browse array apos a inc/alt
Dicas de como melhorar alguns procedimento serão bem vindas.

/*
TITULO     : SISTEMA DE GESTÇO DE COMERCIO
DATA       : 09/03/2020
PROGRAMA   : CADASTROCLIENTES_MARIADB.PRG
COMENTARIO : CADASTRO/RELATORIO (/Clientes)/
*/
#pragma -w0
#pragma -es0

#include "hbgtinfo.ch"
#include "hwgui.ch"
#include "SEFAZ_CIDADE.CH"
#include "SEFAZ_UF.CH"
#define PDFCLASS_PORTRAIT  1
#define PDFCLASS_LANDSCAPE 2
#define PDFCLASS_TXT       3
#define PDFCLASS_ROLLS     4

****************************************
FUNCTION CADASTROCLIENTESMARIADB( )
****************************************
   LOCAL oDlg ;
      , oLabel1, oLabel4 ;
      , oBrowse1 ;
      , oToolbar1 ;
      , nKeyPress ;
      , oColuna, bColorBlock
   
      
      
   PRIVATE   cProgressKey:="";
         , cConsulta:="";
         , cAlvo_Consulta:="CLIENTES_NRAZ_SOC"
         

   oServer := MySqlConnection(  )
   oServer:Open()

******************************************************************************************************************************************************
   aVENBLO    := {"0 - Liberado","1 - Bloqueado"}
   aISENTO    := {"1 - CONTRIBUINTE DE ICMS","2 - CONTRIBUINTE ISENTO","9 - NAO CONTRIBUINTE"}

******************************************************************************************************************************************************

   INIT DIALOG oDlg TITLE "Cadastro de Clientes"  ;
      ICON MEMVAR->SGC_ICON  ;
      AT 0, 0 SIZE 1008,600 CLIPPER  NOEXIT  ;
      ON INIT {|| onDlgInit( oDlg ) }
   
   @ 4,70 BROWSE oBrowse1 ARRAY OF oDlg SIZE 1000,497 STYLE WS_BORDER + WS_VSCROLL +WS_HSCROLL ;
         ON SIZE ANCHOR_TOPABS + ANCHOR_LEFTABS + ANCHOR_RIGHTABS + ANCHOR_BOTTOMABS ;
         ON POSCHANGE {|| hwg_WriteStatus( oDlg,2,LTrim(Str( RecNo(),8))+ "/" +LTrim(Str( Lastrec(),8))) } ;
         ON CLICK {|| oBrowse1_onClick( oDlg, oServer ) } ;
         ON KEYDOWN {|oBrowse1,nKeyPress| oBrowse1_onKeyDown( oBrowse1,nKeyPress, oDlg, oServer ) }

      oBrowse1:oStyleHead := HStyle():New( { 0xffffff, 0xbbbbbb }, 1,, 0.4, 16759929 )
      oBrowse1:oFont := HFont():Add( '',0,-15,700,,,)
      oBrowse1:freeze := 2
      oBrowse1:aArray := CARREGA_CLIENTES( oServer, "ORDER BY CLIENTES_NRAZ_SOC" )

      oBrowse1:AddColumn( HColumn():New( "Codigo",hwg_ColumnArBlock(),"C",08,0,.F.,,,,,,,,;
               {|| oBrowse1:aArray := CARREGA_CLIENTES( oServer, "ORDER BY CLIENTES_UCLIENTE" ), cAlvo_Consulta:="CLIENTES_UCLIENTE",obrowse1:Refresh(), hwg_WriteStatus( oDlg,3,"Ordem: Codigo") } ,,,,))
      oBrowse1:AddColumn( HColumn():New( "Nome Cliente/Razao Social",hwg_ColumnArBlock(),"C",65,0,.F.,,,,,,,,;
               {|| oBrowse1:aArray := CARREGA_CLIENTES( oServer, "ORDER BY CLIENTES_NRAZ_SOC" ), cAlvo_Consulta:="CLIENTES_NRAZ_SOC", obrowse1:Refresh(), hwg_WriteStatus( oDlg,3,"Ordem: Nome Cliente/Razao Social") } ,,,,))
      oBrowse1:AddColumn( HColumn():New( "CPF/CNPJ",hwg_ColumnArBlock(),"C",18,0,.F.,,,,,,,,;
               {|| oBrowse1:aArray := CARREGA_CLIENTES( oServer, "ORDER BY CLIENTES_CPFCGC"), cAlvo_Consulta:="CLIENTES_CPFCGC", obrowse1:Refresh(), hwg_WriteStatus( oDlg,3,"Ordem: CPF/CNPJ") } ,,,,))
      oBrowse1:AddColumn( HColumn():New( "FONE", hwg_ColumnArBlock(),"C",18,0,.F.,,,,,,,,;
               {|| oBrowse1:aArray := CARREGA_CLIENTES( oServer, "ORDER BY CLIENTES_FONE"), cAlvo_Consulta:="CLIENTES_FONE", obrowse1:Refresh(), hwg_WriteStatus( oDlg,3,"Ordem: FONE") } ,,,,))
      oBrowse1:AddColumn( HColumn():New('E-Mail', hwg_ColumnArBlock() ,'C',60, 0 ,.F.,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New( "Insc.Estadual",hwg_ColumnArBlock(),"C",18,0,.F.,,, ) )
      oBrowse1:AddColumn( HColumn():New( "TC",hwg_ColumnArBlock(),"C",4,0,.F., ) )
      oBrowse1:AddColumn( HColumn():New( "Logradouro",hwg_ColumnArBlock(),"C",60,0,.F., ) )
      oBrowse1:AddColumn( HColumn():New( "Numero", hwg_ColumnArBlock(),'N',9,0,.F.,1,2, ) )
      oBrowse1:AddColumn( HColumn():New( "Complemento",hwg_ColumnArBlock(),"C",60,0,.F., ) )
      oBrowse1:AddColumn( HColumn():New('Bairro', hwg_ColumnArBlock() ,'C',60, 0 ,.F.,,,,,,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New('CEP', hwg_ColumnArBlock() ,'C',12, 0 ,.F.,,,,,,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New('Cod.Pais', hwg_ColumnArBlock() ,'C',7, 0 ,.F.,,,,,,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New('Pais', hwg_ColumnArBlock() ,'C',50, 0 ,.F.,,,,,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New('UF', hwg_ColumnArBlock() ,'C',4, 0 ,.F.,,,,,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New('Cod.Mun.', hwg_ColumnArBlock() ,'C',7, 0 ,.F.,,,,,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New('Municipio', hwg_ColumnArBlock() ,'C',50, 0 ,.F.,,,,,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New('Contato', hwg_ColumnArBlock() ,'C',50, 0 ,.F.,,,,,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New('Data Alteração', hwg_ColumnArBlock() ,'D',12, 0 ,.F.,,,,,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New('Operador', hwg_ColumnArBlock() ,'C',20, 0 ,.F.,,,,,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New('Operador/Computador DATA/HORA', hwg_ColumnArBlock() ,'C',60, 0 ,.F.,,,,,,,,))
      oBrowse1:AddColumn( HColumn():New('CLIENTES ID', hwg_ColumnArBlock() ,'N',14, 0 ,.F.,1,2,,,,,,;
               {|| oBrowse1:aArray := CARREGA_CLIENTES( oServer, "ORDER BY CLIENTES_ID"), cAlvo_Consulta:="CLIENTES_ID", obrowse1:Refresh(), hwg_WriteStatus( oDlg,3,"Ordem: CHAVE ID") } ,,,,))

      bColorBlock := {|| {0,16777215,, } }      
      FOR EACH oColuna IN oBrowse1:aColumns
         oColuna:bColorBlock := bColorBlock
      NEXT

   @ 1,-1 TOOLBAR oToolbar1  SIZE hwg_Getdesktopwidth(),43     
               
      oToolbar1:AddButton("CMDINSERT", , 0, 16, "Inclui" ,{||CADCLIENTES( oServer, , "INCLUIR"  ), oBrowse1:aArray := CARREGA_CLIENTES( oServer, "ORDER BY " + cAlvo_Consulta ), obrowse1:REFRESH()},'Incluir novo Cliente','', "oToolbutton1")
      oToolbar1:AddButton("CMDEDIT", , 0, 16, "Altera"   ,{||CADCLIENTES( oServer, LTRIM(str(oDlg:oBrowse1:aArray[ oDlg:oBrowse1:nCurrent, 22])), "ALTERAR"  ), oBrowse1:aArray := CARREGA_CLIENTES( oServer, "ORDER BY " + cAlvo_Consulta ), obrowse1:REFRESH()},'Altera os dados do Cliente','', "oToolbutton2")
      oToolbar1:AddButton("CMDDELETE", , 0, 16, "Exclui" ,{||CADCLIENTES_EXCLUI( oDlg, oServer ), oBrowse1:aArray := CARREGA_CLIENTES( oServer, "ORDER BY " + cAlvo_Consulta ), obrowse1:REFRESH() },'Exclui os dados do Cliente','', "oToolbutton3")
//      oToolbar1:AddButton("CLFLBMP", , 4, 16, "Consulta" ,{||CONSULTACADCLIENTES( )},'Consulta dados do Cadastro de Clientes','', "oToolbutton5")
      oToolbar1:AddButton("rel_print",, 4, 128, "Relatórios" ,,, {{"Cadastro de Clientes ", 4,{| This, nId | RELATORIO_CLIENTES( ) }}};
                                                   , "oToolbutton6")
      oToolbar1:AddButton("EXIT16BMP", , 4, 16, "Sair" ,{|| DBCLOSEALL(), oDlg:Close() },'Sair da rotina','', "oToolbutton7")
      oToolbar1:CreateTool()

    ADD STATUS PANEL TO oDlg HEIGHT 30  PARTS 200,120,300
   @ 4,45 SAY oLabel1 CAPTION "Pesquisar"  SIZE 138,25 ;
      STYLE SS_CENTER +WS_DLGFRAME    
   @ 150,45 SAY oLabel4 CAPTION "" SIZE 410,25 ;
        STYLE WS_BORDER;
        COLOR 16777215  BACKCOLOR 255

   
      
   ACTIVATE DIALOG oDlg CENTER   
   oServer:Close()
   
RETURN NIL

******************************************************************
STATIC FUNCTION CARREGA_CLIENTES( oServer, cAlvo_Consulta )
******************************************************************
LOCAL aResult :={};
   , oQuery;
   , cQuery
   
   cQuery := "SELECT CLIENTES_UCLIENTE, ";
               + "CLIENTES_NRAZ_SOC, ";
               + "CLIENTES_CPFCGC, ";
               + "CLIENTES_FONE, ";
               + "CLIENTES_EMAIL, ";
               + "CLIENTES_INSEST, ";
               + "CLIENTES_ISENTO, ";
               + "CLIENTES_ENDER, ";
               + "CLIENTES_NUMERO, ";
               + "CLIENTES_COMPLEM, ";
               + "CLIENTES_BAIR, ";
               + "CLIENTES_CEP, ";
               + "CLIENTES_CODPAIS, ";
               + "CLIENTES_PAIS, ";
               + "CLIENTES_UF, ";
               + "CLIENTES_CODMUN, ";
               + "CLIENTES_CIDADE, ";
               + "CLIENTES_CONTATO, ";
               + "CLIENTES_DATALT, ";
               + "CLIENTES_USUALT, ";                              
               + "CLIENTES_QUEM_BLOQ, ";
               + "CLIENTES_ID ";
               + "from CLIENTES ";
               + cAlvo_Consulta

   oQuery := oServer:Execute(cQuery)

   DO WHILE ! oQuery:Eof()
      aAdd( aResult, {oQuery:Fields( "CLIENTES_UCLIENTE" ):Value,;
                  oQuery:Fields( "CLIENTES_NRAZ_SOC" ):Value,;
                  oQuery:Fields( "CLIENTES_CPFCGC" ):Value,;
                  oQuery:Fields( "CLIENTES_FONE" ):Value,;
                  oQuery:Fields( "CLIENTES_EMAIL" ):Value,;
                  oQuery:Fields( "CLIENTES_INSEST" ):Value,;
                  oQuery:Fields( "CLIENTES_ISENTO" ):Value,;
                  oQuery:Fields( "CLIENTES_ENDER" ):Value,;
                  oQuery:Fields( "CLIENTES_NUMERO" ):Value,;
                  oQuery:Fields( "CLIENTES_COMPLEM" ):Value,;
                  oQuery:Fields( "CLIENTES_BAIR" ):Value,;
                  oQuery:Fields( "CLIENTES_CEP" ):Value,;
                  oQuery:Fields( "CLIENTES_CODPAIS" ):Value,;
                  oQuery:Fields( "CLIENTES_PAIS" ):Value,;
                  oQuery:Fields( "CLIENTES_UF" ):Value,;
                  oQuery:Fields( "CLIENTES_CODMUN" ):Value,;
                  oQuery:Fields( "CLIENTES_CIDADE" ):Value,;
                  oQuery:Fields( "CLIENTES_CONTATO" ):Value,;
                  oQuery:Fields( "CLIENTES_DATALT" ):Value,;
                  oQuery:Fields( "CLIENTES_USUALT" ):Value,;
                  oQuery:Fields( "CLIENTES_QUEM_BLOQ" ):Value,;
                  oQuery:Fields( "CLIENTES_ID" ):Value} )

      oQuery:MoveNext()
   ENDDO
   oQuery:Close()   
      
RETURN aResult

******************************************************************
STATIC FUNCTION onDlgInit( oDlg )
******************************************************************
      oDlg:oToolbar1:oToolbutton1:ENABLE()
      oDlg:oToolbar1:oToolbutton2:ENABLE()
      IF strzero(M->NIV_ACESSO,1,0)$"689"
         oDlg:oToolbar1:oToolbutton3:ENABLE()
      ENDIF

   hwg_WriteStatus( oDlg,1,"Tabela: CLIENTES")
    hwg_WriteStatus( oDlg,2,oDlg:oBrowse1:nCurrent)                 
    hwg_WriteStatus( oDlg,3,"Ordem: Nome Cliente/Razao Social")   
RETURN Nil

******************************************************
STATIC FUNCTION CADCLIENTES_EXCLUI( oDlg, oServer )
******************************************************
LOCAL oQuery;
   
   IF hwg_MsgYesNo("DESEJA excluir, Tem certeza disso ?","Excluindo Cliente")
      BEGIN SEQUENCE
         oQuery := oServer:Execute("DELETE FROM clientes WHERE CLIENTES_Id='" + LTRIM(str(oDlg:oBrowse1:aArray[ oDlg:oBrowse1:nCurrent, 22])) + "'")
      RECOVER
         hwg_msginfo("REGISTRO NÃO FOI EXCLUIDO, ERRO DE ESCLUSÃO","Excluindo Cliente")
      END SEQUENCE
   ENDIF

RETURN NIL

***********************************************************
STATIC FUNCTION oBrowse1_onClick( oDlg, oServer )
***********************************************************
   IF hwg_LastKey() ==   MK_LBUTTON
      CADCLIENTES( oServer, LTRIM(str(oDlg:oBrowse1:aArray[ oDlg:oBrowse1:nCurrent, 22])), "CONSULTAR"  )
      oDlg:oBrowse1:Refresh()
      RETURN .T.
   ENDIF
RETURN .T.


*******************************************************************
STATIC FUNCTION oBrowse1_onKeyDown( oBrowse1, nKey, oDlg, oServer )
*******************************************************************
LOCAL nPosicao:=0;
   , nKeyPress:=nkey;
   , cRegEx := "[a-zA-Z0-9 ]{1}";
   , cQuery
   
   KSETCAPS(.T.);

   IF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ "34|33|37|38|39|40|20|16"
      cProgressKey:=""
      oDlg:oLabel4:settext(cProgressKey)
      RETURN .T.
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [90]
      nKeyPress := 90
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [96]
      nKeyPress := 48
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [97]
      nKeyPress := 49
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [98]
      nKeyPress := 50
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [99]
      nKeyPress := 51
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [100]
      nKeyPress := 52
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [101]
      nKeyPress := 53
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [102]
      nKeyPress := 54
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [103]
      nKeyPress := 55
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [104]
      nKeyPress := 56
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [105]
      nKeyPress := 57
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [106]
      nKeyPress := 42
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [190]
      nKeyPress := 46
   ELSEIF nKeyPress == Asc("8") .AND. hwg_isCtrlShift( .F.,.T. )
      nKeyPress := 42      
   ENDIF   
   
   IF  nKeyPress = VK_RETURN
      CADCLIENTES( oServer, LTRIM(str(oDlg:oBrowse1:aArray[ oDlg:oBrowse1:nCurrent, 22])), "CONSULTAR"  )
      oDlg:oBrowse1:Refresh()
      RETURN .T.   
   ELSEIF nKeyPress = VK_ESCAPE
      oDlg:Close()      
      RETURN .T.
   ENDIF
      
   If nKeyPress # 8
      cProgressKey += Chr(nKeyPress)
      nPosicao:=AScan(oDlg:oBrowse1:aArray,cProgressKey)
      oDlg:oLabel4:settext(cProgressKey)
      cConsulta:= "WHERE " + cAlvo_Consulta + " LIKE '" + cProgressKey + "%'" + " ORDER BY CLIENTES_NRAZ_SOC"
      oBrowse1:aArray := CARREGA_CLIENTES( oServer, cConsulta )
      oDlg:obrowse1:REFRESH()
   ELSEIF nKeyPress = 8 .AND. Len(cProgressKey) >= 1
      cProgressKey:=Left(cProgressKey,Len(cProgressKey) - 1)
      nPosicao:=AScan(oDlg:oBrowse1:aArray,cProgressKey)
      oDlg:oLabel4:settext(cProgressKey)
      cConsulta:= "WHERE " + cAlvo_Consulta + " LIKE '" + cProgressKey + "%'" + " ORDER BY CLIENTES_NRAZ_SOC"
      oBrowse1:aArray := CARREGA_CLIENTES( oServer, cConsulta )
      oDlg:obrowse1:REFRESH()
   ENDIF   
   IF nPosicao # 0
      cConsulta:= "WHERE " + cAlvo_Consulta + " LIKE '" + cProgressKey + "%'" + " ORDER BY CLIENTES_NRAZ_SOC"
      oBrowse1:aArray := CARREGA_CLIENTES( oServer, cConsulta )
      oDlg:obrowse1:REFRESH()
   ENDIF 

return .T.   
   
***********************************************************
STATIC FUNCTION CADCLIENTES( oServer, cClientes_Id, cAcao )
***********************************************************

LOCAL     oDlg,  oStatus1, oLine1,oLine2, oEdit1, oLabel1, oEdit2, oLabel2, oEdit3 ;
      , oLabel3, oEdit4, oLabel4, oEdit5, oLabel5, oEdit6, oLabel6, oOwnerbutton1 ;
      , oCombo1, oLabel7, oLink1, oLink2, oEdit7, oLabel8, oEdit8, oLabel9, oEdit9 ;
      , oLabel10, oEdit10, oLabel11, oEdit11, oLabel12, oLabel13, oCombo2, oLabel14 ;
      , oCombo3, oLabel15, oEdit13, oLabel16, oEdit14, oLabel17, oCombo4, oEdit12 ;
      , oCombo5, oCombo6, oLabel19, oLabel18, oEdit15, oLabel20, oEdit16, oLabel21, oEdit17 ;
      , oLabel22, oOwnerbutton2, oOwnerbutton3, oOwnerbutton4, oPanel1, oLabel24, oLabel25, oLabel26 ;
      , oPAIS, oUF, oCIDADE;
      , cEdit1 := "" , nEdit2 := 0 , nEdit3 := 0 , nEdit4 := 0 , nEdit5 := 0 , cEdit6 := "" ;
      , cEdit7 := "" , nEdit8 := 0 , cEdit9 := "" , cEdit10 := "" , nEdit11 := 0  ;
      , cEdit13 := "" , cEdit14 := ""  , nEdit12 := 0 , nCombo5 := 1 , nEdit15 := 0 ;
      , dEdit16 := DATE() , dEdit17 := DATE() ;
      , oQuery;
      , cQuery;
      
private   aPAIS:= {};      
      , aUF:= {};
      , aMunicipios:= {};
      , nCombo1 := 1;
      , nCombo2 := 1;
      , nCombo6 := 1;
      , nCombo3 := 1;
      , nCombo4 := 1

   hb_Default( @cAcao, "CONSULTAR" )
   hb_Default( @cClientes_Id, "0" )
      
//   hwg_MsgInfo(cAcao + "/" + cClientes_Id)
//   RETURN NIL
      
   IF cAcao = "INCLUIR"
      MEMVAR->ID         :=0
      MEMVAR->TIPCLI     :=1
      MEMVAR->NRAZ_SOC   :=SPACE(60)
      MEMVAR->TIPDOC     :=1
      MEMVAR->CPFCGC     :=SPACE(18)
      MEMVAR->CPFCGC_ANT   :=SPACE(18)
      MEMVAR->INSEST     :=SPACE(18)
      MEMVAR->INSMUN     :=SPACE(18)
      MEMVAR->ISENTO     :=SPACE(01)
      MEMVAR->SUFRAMA    :=SPACE(18)
      MEMVAR->EMAIL      :=SPACE(60)
      MEMVAR->ENDER      :=SPACE(60)
      MEMVAR->NUMERO     :=0
      MEMVAR->COMPLEM    :=SPACE(60)
      MEMVAR->BAIR       :=SPACE(50)
      MEMVAR->CEP        :=space(09)
      MEMVAR->CODPAIS    :="1058"
      MEMVAR->PAIS       :="BRASIL"
      MEMVAR->UF         :="AC"
      MEMVAR->CIDADE     :="RIO BRANCO"
      MEMVAR->CODMUN     :="1200401"
      MEMVAR->FONE       :=SPACE(14)
      MEMVAR->CONTATO    :=SPACE(80)
      MEMVAR->LIMCRE     :=0.00
      MEMVAR->TOTCRE     :=0.00 
      MEMVAR->VENBLO     :="1"
      MEMVAR->DATCAD     :=M->DAT_HOJE
      MEMVAR->DATALT     :=M->DAT_HOJE
      MEMVAR->USUALT     :=M->OPERADOR
      MEMVAR->TAXCLI     :=0.00
      MEMVAR->NUMPAR     :=0.00
      MEMVAR->PERDES     :=0.00
      MEMVAR->VALMIN     :=0.00
   ELSE
      cQuery := "SELECT  CLIENTES_ID, ";
                  + "CLIENTES_TIPCLI, ";
                  + "CLIENTES_NRAZ_SOC, ";
                  + "CLIENTES_TIPDOC, ";
                  + "CLIENTES_CPFCGC, ";
                  + "CLIENTES_INSEST, ";
                  + "CLIENTES_INSMUN, ";
                  + "CLIENTES_ISENTO, ";
                  + "CLIENTES_SUFRAMA, ";
                  + "CLIENTES_EMAIL, ";
                  + "CLIENTES_ENDER, ";
                  + "CLIENTES_NUMERO, ";
                  + "CLIENTES_COMPLEM, ";
                  + "CLIENTES_BAIR, ";
                  + "CLIENTES_CEP, ";
                  + "CLIENTES_CODPAIS, ";
                  + "CLIENTES_PAIS, ";
                  + "CLIENTES_UF, ";
                  + "CLIENTES_CIDADE, ";
                  + "CLIENTES_CODMUN, ";
                  + "CLIENTES_FONE, ";
                  + "CLIENTES_CONTATO, ";
                  + "CLIENTES_LIMCRE, ";
                  + "CLIENTES_TOTCRE, ";
                  + "CLIENTES_VENBLO, ";
                  + "CLIENTES_DATCAD, ";
                  + "CLIENTES_DATALT, ";
                  + "CLIENTES_USUALT, ";
                  + "CLIENTES_TAXCLI, ";
                  + "CLIENTES_NUMPAR, ";
                  + "CLIENTES_PERDES, ";
                  + "CLIENTES_VALMIN ";
                  + "FROM CLIENTES ";
                  + "WHERE CLIENTES_ID = ";
                  + "'" + cClientes_Id + "'"
               
      oQuery := oServer:Execute(cQuery)         
   
      MEMVAR->ID         :=cClientes_Id
      MEMVAR->TIPCLI     :=VAL(oQuery:Fields( "CLIENTES_TIPCLI" ):Value)
      MEMVAR->NRAZ_SOC   :=oQuery:Fields( "CLIENTES_NRAZ_SOC" ):Value
      MEMVAR->TIPDOC     :=VAL(oQuery:Fields( "CLIENTES_TIPDOC" ):Value)
      MEMVAR->CPFCGC     :=oQuery:Fields( "CLIENTES_CPFCGC" ):Value
      MEMVAR->INSEST     :=oQuery:Fields( "CLIENTES_INSEST" ):Value
      MEMVAR->INSMUN     :=oQuery:Fields( "CLIENTES_INSMUN" ):Value
      MEMVAR->ISENTO     :=oQuery:Fields( "CLIENTES_ISENTO" ):Value
      MEMVAR->SUFRAMA    :=oQuery:Fields( "CLIENTES_SUFRAMA" ):Value
      MEMVAR->EMAIL      :=oQuery:Fields( "CLIENTES_EMAIL" ):Value
      MEMVAR->ENDER      :=oQuery:Fields( "CLIENTES_ENDER" ):Value
      MEMVAR->NUMERO     :=oQuery:Fields( "CLIENTES_NUMERO" ):Value
      MEMVAR->COMPLEM    :=oQuery:Fields( "CLIENTES_COMPLEM" ):Value
      MEMVAR->BAIR       :=oQuery:Fields( "CLIENTES_BAIR" ):Value
      MEMVAR->CEP        :=oQuery:Fields( "CLIENTES_CEP" ):Value
      MEMVAR->CODPAIS    :=oQuery:Fields( "CLIENTES_CODPAIS" ):Value
      MEMVAR->PAIS       :=oQuery:Fields( "CLIENTES_PAIS" ):Value
      MEMVAR->UF         :=oQuery:Fields( "CLIENTES_UF" ):Value
      MEMVAR->CIDADE     :=oQuery:Fields( "CLIENTES_CIDADE" ):Value
      MEMVAR->CODMUN     :=oQuery:Fields( "CLIENTES_CODMUN" ):Value
      MEMVAR->FONE       :=oQuery:Fields( "CLIENTES_FONE" ):Value
      MEMVAR->CONTATO    :=oQuery:Fields( "CLIENTES_CONTATO" ):Value
      MEMVAR->LIMCRE     :=oQuery:Fields( "CLIENTES_LIMCRE" ):Value
      MEMVAR->TOTCRE     :=oQuery:Fields( "CLIENTES_TOTCRE" ):Value
      MEMVAR->VENBLO     :=oQuery:Fields( "CLIENTES_VENBLO" ):Value
      MEMVAR->DATCAD     :=oQuery:Fields( "CLIENTES_DATCAD" ):Value
      MEMVAR->DATALT     :=M->DAT_HOJE
      MEMVAR->USUALT     :=M->OPERADOR
      MEMVAR->TAXCLI     :=oQuery:Fields( "CLIENTES_TAXCLI" ):Value
      MEMVAR->NUMPAR     :=oQuery:Fields( "CLIENTES_NUMPAR" ):Value
      MEMVAR->PERDES     :=oQuery:Fields( "CLIENTES_PERDES" ):Value
      MEMVAR->VALMIN     :=oQuery:Fields( "CLIENTES_VALMIN" ):Value
      
      MEMVAR->CPFCGC_ANT   :=MEMVAR->CPFCGC
   ENDIF

   FOR EACH oPAIS IN SEFAZ_CIDADE
      IF oPAIS[1] == "EX"
         AAdd(aPAIS,oPAIS[3])
      ENDIF
   NEXT
   
   FOR EACH oUF IN SEFAZ_UF
      AAdd(aUF,oUF[1])
   NEXT
   
   FOR EACH oCIDADE IN SEFAZ_CIDADE
      IF oCIDADE[1] == MEMVAR->UF
         AAdd(aMunicipios,oCIDADE[3])
      ENDIF
   NEXT
      
********************************************************************************

  INIT DIALOG oDlg TITLE "Cadastro de Cliente - "+cAcao ;
      ICON MEMVAR->SGC_ICON  ;
      AT 0, 0 SIZE 1008,600 CLIPPER  NOEXIT 
      
    ThisCAD := oDlg
   hwg_SetColorinFocus( oDlg,, 13172680 )

//    ADD STATUS PANEL TO oDlg HEIGHT 30  PARTS 200,120,300
   @ 0,175 LINE oLine1 LENGTH 1008
        oLine1:Anchor := 11
   @ 415,15 SAY oLink1 CAPTION "http://www.sintegra.gov.br"  ;
        LINK 'http://www.sintegra.gov.br/new_bv.html'  SIZE 180,22       
   @ 79,17 SAY oLabel2 CAPTION "CNPJ/CPF"  SIZE 67,21       
   @ 150,15 GET oEdit2 VAR MEMVAR->CPFCGC SIZE 201,24 ;
        STYLE ES_LEFT  MAXLENGTH 14   VALID  {|| VERIFICA_CPFCNPJ( oDlg, oServer ) }
      
   @ 16,49 SAY oLabel1 CAPTION "Nome/Razão Social"  SIZE 131,21
   @ 150,47 GET oEdit1 VAR MEMVAR->NRAZ_SOC SIZE 657,24 STYLE ES_UPPERCASE PICTURE '@!' MAXLENGTH 60 VALID  {|| VERIFICA_NRAZ_SOC( oDlg, cAcao ) }
        oEdit1:Anchor := 11
   @ 25,81 SAY oLabel3 CAPTION "Inscrição Estadual"  SIZE 122,21   
   @ 150,79 GET oEdit3 VAR MEMVAR->INSEST SIZE 202,24 ;
        STYLE ES_LEFT  MAXLENGTH 15  ;
        VALID  {|| oEdit3_onLostFocus(  ) }
      
   @ 404,81 SAY oLabel7 CAPTION "Tipo Contribuinte"  SIZE 112,21
   @ 521,79 GET COMBOBOX oCombo1 VAR nCombo1 ;
        ITEMS aISENTO  ;
        SIZE 218,24 
   @ 18,113 SAY oLabel4 CAPTION "Inscrição Municipal"  SIZE 128,21       
   @ 150,111 GET oEdit4 VAR MEMVAR->INSMUN SIZE 202,24 ;
        STYLE ES_RIGHT  MAXLENGTH 15       
   @ 397,113 SAY oLabel5 CAPTION "Inscrição Suframa"  SIZE 119,21      
   @ 521,111 GET oEdit5 VAR MEMVAR->SUFRAMA SIZE 201,24 ;   
        STYLE ES_RIGHT  MAXLENGTH 15   
   @ 101,146 SAY oLabel6 CAPTION "E-Mail"  SIZE 43,21      
   @ 149,144 GET oEdit6 VAR MEMVAR->EMAIL SIZE 657,24 STYLE ES_LOWERCASE MAXLENGTH 60 
        oEdit6:Anchor := 11       
   @ 69,185 SAY oLabel9 CAPTION "CEP"  SIZE 29,24 
   @ 105,183 GET oEdit8 VAR MEMVAR->CEP SIZE 80,24  STYLE ES_RIGHT PICTURE '99999-999'  MAXLENGTH 9
   
   @ 246,187 SAY oLink2 CAPTION "http://www.correios.com.br"  ;
        LINK 'http://www.buscacep.correios.com.br/sistemas/buscacep/buscaEndereco.cfm'  SIZE 181,22   
   
   @ 22,216 SAY oLabel10 CAPTION "Logradouro"  SIZE 76,24 
   @ 105,214 GET oEdit9 VAR MEMVAR->ENDER SIZE 703,24 STYLE ES_UPPERCASE PICTURE '@!' MAXLENGTH 60 
        oEdit9:Anchor := 11   
   @ 45,248 SAY oLabel11 CAPTION "Numero"  SIZE 53,21
   @ 105,246 GET oEdit11 VAR MEMVAR->NUMERO SIZE 80,24 ;
        STYLE ES_RIGHT  MAXLENGTH 20
   @ 7,280 SAY oLabel8 CAPTION "Complemento"  SIZE 91,24
   @ 104,278 GET oEdit7 VAR MEMVAR->COMPLEM SIZE 490,24 STYLE ES_UPPERCASE PICTURE '@!' MAXLENGTH 60       
   @ 56,311 SAY oLabel12 CAPTION "Bairro"  SIZE 42,24 
   @ 105,309 GET oEdit13 VAR MEMVAR->BAIR SIZE 490,24 STYLE ES_UPPERCASE PICTURE '@!' MAXLENGTH 50
   @ 67,341 SAY oLabel13 CAPTION "Pais"  SIZE 31,24 
   @ 105,339 GET COMBOBOX oCombo4 VAR nCombo4 ;
        ITEMS aPAIS  ;
        SIZE 259,24  DISPLAYCOUNT 8   
   @ 78,376 SAY oLabel14 CAPTION "UF"  SIZE 20,24
   @ 105,374 GET COMBOBOX oCombo2 VAR nCombo2 ;
        ITEMS aUF  ;
        SIZE 65,24  DISPLAYCOUNT 8 ;
      ON CHANGE {|| oCombo2_onChange( oDlg, aUF[nCombo2] ),oCombo3:REFRESH() }
      
   @ 33,407 SAY oLabel15 CAPTION "Municipio"  SIZE 65,24
   @ 105,405 GET COMBOBOX oCombo3 VAR nCombo3  ITEMS aMunicipios  ;
        SIZE 259,24 DISPLAYCOUNT 7 
      
   @ 40,436 SAY oLabel16 CAPTION "Telefone"  SIZE 58,24       
   @ 105,434 GET oEdit10 VAR MEMVAR->FONE SIZE 260,24  MAXLENGTH 14  ;
         VALID  {|| oEdit10_onLostFocus(  ) } 
   
   @ 47,465 SAY oLabel17 CAPTION "Contato"  SIZE 51,24
   @ 105,463 GET oEdit14 VAR MEMVAR->CONTATO SIZE 495,24  MAXLENGTH 80 


   @ 355,14 OWNERBUTTON oOwnerbutton1  SIZE 24,24 ;
        TEXT ''  ;
        COORDINATES 0, 0, 0, 0  ;
        BITMAP 'FINDBMP' FROM RESOURCE TRANSPARENT;
        COORDINATES 0, 0, 0, 0 ;
      ON CLICK {|| oEdit2:setfocus(), CADASTROCLIENTES_CONSULTA_CNPJ(  ) }

   @ 191,183 OWNERBUTTON oOwnerbutton4  SIZE 24,24   ;
        TEXT ''  ;
        COORDINATES 0, 0, 0, 0  ;
        BITMAP 'FINDBMP' FROM RESOURCE TRANSPARENT;
        COORDINATES 0, 0, 0, 0 ;
      ON CLICK {|| oEdit8:setfocus(), CADASTROCLIENTES_CONSULTA_CEP( MEMVAR->CEP )}

   IF cAcao != "CONSULTAR"
      @ 904,560  OWNERBUTTON oOwnerbutton2  SIZE 98,32 DISABLED  ;
         TEXT 'Salvar'  ;
         COORDINATES 30, 0, 0, 0  ;
         BITMAP 'APPLYBMP' FROM RESOURCE TRANSPARENT;
         COORDINATES 5, 0, 0, 0;
         ON CLICK {|| SALVA_CLIENTES( oServer, cClientes_Id, cAcao ), hwg_Enddialog() }      
         oOwnerbutton2:Anchor := 12
   ENDIF

   @ 830,240 GROUPBOX oGroup1 CAPTION ""  SIZE 173,267

   @ 840,251 SAY oLabel21 CAPTION "Faturamento"  SIZE 110,21
   @ 840,272 GET COMBOBOX oCombo6 VAR nCombo6 ITEMS aVENBLO SIZE 154,24  ;
      ON CHANGE {|| oCombo6_onChange( oCombo6:GETTEXT( ) ) }

   @ 840,297 SAY oLabel23 CAPTION "Limite de crédito"  SIZE 110,21
   @ 840,319 GET oEdit18 VAR MEMVAR->LIMCRE SIZE 154,24 ;
        STYLE ES_RIGHT +WS_DISABLED  PICTURE '@E 999,999,999.99' MAXLENGTH 14   
      
   @ 840,344 SAY oLabel18 CAPTION "Utilizado"  SIZE 60,21
   @ 840,366 GET oEdit12 VAR MEMVAR->TOTCRE SIZE 154,24 ;
        STYLE ES_RIGHT+WS_DISABLED  PICTURE '@E 999,999,999.99' MAXLENGTH 14

      
   @ 840,392 SAY oLabel19 CAPTION "Data Inclusão"  SIZE 91,21 ;

   @ 840,415 SAY oLabel24 CAPTION dtoc(MEMVAR->DATCAD)  SIZE 154,30 ;
      STYLE WS_BORDER+SS_CENTER ;
      COLOR 16777215  BACKCOLOR 255  ;
      FONT HFont():Add( '',0,-21,400,,,)

   @ 840,449 SAY oLabel20 CAPTION "Data ultima Alteração"  SIZE 141,21 ;

   @ 840,470 SAY oLabel25 CAPTION dtoc(MEMVAR->DATALT)  SIZE 154,30 ;
      STYLE WS_BORDER+SS_CENTER ;
      COLOR 16777215  BACKCOLOR 255  ;
      FONT HFont():Add( '',0,-21,400,,,) 
   
   IF MEMVAR->UF # "AC"
      oCombo2_onChange( oDlg, MEMVAR->UF )   
   ENDIF

   oCombo6:SetItem( Ascan(aVENBLO,MEMVAR->VENBLO ) )      
   oCombo1:SetItem( Ascan(aISENTO,MEMVAR->ISENTO ) )   
   oCombo4:SetItem( Ascan(aPAIS,RTRIM(MEMVAR->PAIS) ) )   
   oCombo2:SetItem( Ascan(aUF,RTRIM(MEMVAR->UF) ) )   
   oCombo3:SetItem( Ascan(aMunicipios,RTRIM(MEMVAR->CIDADE) ) )
   

   ACTIVATE DIALOG oDlg CENTER

RETURN NIL

************************************************
STATIC FUNCTION VERIFICA_NRAZ_SOC( oDlg, cAcao )
************************************************
IF cAcao = "CONSULTAR"
   RETURN .T.
ENDIF

IF MEMVAR->NRAZ_SOC = SPACE(60)
   oDlg:oOwnerbutton2:DISABLE()
   RETURN .F.
ELSE
   oDlg:oOwnerbutton2:ENABLE()   
   RETURN .T.
ENDIF

**************************************************
STATIC FUNCTION oCombo2_onChange( oDlg, mUF )
**************************************************
LOCAL oCIDADE
   DO WHILE .T.
   
      FOR nI = Len( aMunicipios ) TO 1 STEP -1
         hb_ADel( aMunicipios, nI, .T. )
      NEXT
//      FOR nI := 1 TO Len(aMunicipios)
//         hb_ADel( aMunicipios, nI, .T. )
//      NEXT
      IF Len(aMunicipios) <= 0
         EXIT
      ENDIF
   ENDDO
   FOR EACH oCIDADE IN SEFAZ_CIDADE
      IF oCIDADE[1] == mUF
         AAdd(aMunicipios,oCIDADE[3])
      ENDIF
   NEXT
   oDlg:oCombo3:SetItem( Ascan(aMunicipios,RTRIM(MEMVAR->CIDADE) ) )
//   nCombo3 := 1
RETURN( aMunicipios )
******************************************************
STATIC FUNCTION CADASTROCLIENTES_CONSULTA_CNPJ(  )
******************************************************
LOCAL oDlg,  oOwnerbutton2, oOwnerbutton3, oCNPJ, oLabel1, oLabel2, oBitmap1, oCombo1

Local  cCNPJ := mCPFCGC , nCombo1 := 1
   SELE CERTIFICADO
   IF !DBSEEK(rtrim(hwg_GetComputerName()))
      hwg_MsgInfo("Este Computador não possui CERTIFICADO DIGITAL instalado"+ HB_EOL()+"Pesquisa não poderá ser efetuada")
      SELE CLIENTES
      return .T.
   endif
   SELE CLIENTES

   INIT DIALOG oDlg TITLE "CONSULTA CNPJ"  ;
      ICON MEMVAR->SGC_ICON  ;
      AT 0, 0 SIZE 445,168 CLIPPER  NOEXIT 
      
    ThisCNPJ := oDlg

   hwg_SetColorinFocus( oDlg,, 13172680 )

   @ 24,35 BITMAP oBitmap1  SHOW 'searchonline' FROM RESOURCE  SIZE 62,62 
      
   @ 333,100 OWNERBUTTON oOwnerbutton2  SIZE 98,32  ;
        TEXT "Pesquisa"  ;
        COORDINATES 30, 0, 0, 0  ;
        BITMAP 'APPLYBMP' FROM RESOURCE TRANSPARENT;
        COORDINATES 5, 0, 0, 0;
      ON CLICK {|| CADASTROCLIENTES_PESQUISA_CNPJ(cCNPJ,aUF[nCombo1] ), oDlg:close() }      
        oOwnerbutton2:Anchor := 12
      
      
   @ 188,29 GET oCNPJ VAR cCNPJ SIZE 246,24  MAXLENGTH 14   
   @ 110,32 SAY oLabel1 CAPTION "CNPJ:"  SIZE 72,21 ;
        STYLE SS_RIGHT 
   @ 158,68 SAY oLabel2 CAPTION "UF:"  SIZE 24,21 
   @ 188,65 GET COMBOBOX oCombo1 VAR nCombo1 ;
        ITEMS aUF ;
        SIZE 63,24 DISPLAYCOUNT 5 

   ACTIVATE DIALOG oDlg CENTER

RETURN oDlg:lresult
***************************************************************
STATIC FUNCTION CADASTROCLIENTES_PESQUISA_CNPJ( cCNPJ,cUF)
***************************************************************
   DBSELECTAREA("CERTIFICADO")
   IF !DBSEEK(rtrim(hwg_GetComputerName()))
      hwg_MsgInfo("Computador sem certificado digital instalado"+ HB_EOL()+"A Operação não poderá ser efetuada")
      DBSELECTAREA("CLIENTES")
      RETURN NIL
   endif
   DBSELECTAREA("CLIENTES")
   IF LEN(RTRIM(cCNPJ)) < 14
      hwg_MsgInfo("CONSULTA AO CADASTRO DE CONTRIBUINTES SOMENTE POR CNPJ "+ HB_EOL()+ HB_EOL()+ "Clique no LINK para acesso ao SINTEGRA" )
      RETURN NIL
   ENDIF
   oSefaz:= SefazClass():New()
   oSefaz:cCertificado := TRIM(CERTIFICADO->NOMCERT)
//   hwg_MsgInfo("["+TRIM(cCnpj)+"]"+"["+cUF+"]")
   cRetorno:=oSefaz:NFeConsultaCadastro( TRIM(cCnpj), cUF, oSefaz:cCertificado, FLAG->n_tpAmb )

   if XmlNode(cRetorno, "cStat") $ "111,112"
      cStat       :=XmlNode(cRetorno, "cStat")
      xMotivo       :=XmlNode(cRetorno, "xMotivo")
      m->leitura  :=XmlNode(cRetorno, "infCad")
      mCPFCGC     :=cCNPJ
      mNRAZ_SOC    :=XmlNode(cRetorno, "xNome") + space(60-len(XmlNode(cRetorno, "xNome")))
      mNRAZ_FANT   :=XmlNode(cRetorno, "xFant") + space(60-len(XmlNode(cRetorno, "xFant")))
      mINSEST      :=XmlNode(cRetorno, "IE") + space(18-len(XmlNode(cRetorno, "IE")))
      mISENTO      :=XmlNode(cRetorno, "cSit")
      mCEP         :=SUBSTR(XmlNode(cRetorno, "CEP"),1,5)+"-"+SUBSTR(XmlNode(cRetorno, "CEP"),6,3)
      mNUMERO      :=val(XmlNode(cRetorno, "nro"))
      mBAIR        :=XmlNode(cRetorno, "xBairro")
      mCIDADE      :=XmlNode(cRetorno, "xMun")
      mUF          :=XmlNode(cRetorno, "UF")
      mENDER       :=XmlNode(cRetorno, "xLgr")
      IF cStat = "112"
         cRetorno := "ACESSE AO SINTEGRA: http://www.sintegra.gov.br"+ HB_EOL()+ "PARA CONSULTA DETALHADA"
      ENDIF
      IF LEN(cCNPJ) < 14
         mCPFCGC:=replicate("0",14-LEN(cCNPJ))+cCNPJ
      endif

//      hwg_MsgInfo(mCPFCGC)

      IF ! ValidIE( RTRIM(mINSEST), mUF )
         mINSEST:="0"+mINSEST
      ENDIF
      IF mISENTO = "0"
         mISENTO = "2"
         mINSEST:= SPACE(18)
      ENDIF
//      hwg_MsgInfo( ;
//                "STATUS: " + cStat + hb_Eol()+ ;
//                "MOTIVO: " + xMotivo + hb_Eol()+hb_Eol()+ ;
//                "CNPJ: " + cCNPJ + hb_Eol() + ;
//                "RAZAO SOCIAL: " + mNRAZ_SOC + hb_Eol() + ;
//                "NOME FANTASIA: " + mNRAZ_FANT + hb_Eol() + ;
//                "INSC.EST.: " + mINSEST + hb_Eol() + ;
//                "TIPO CONT.: " + mISENTO + hb_Eol() + ;
//                "CEP.: " + mCEP + hb_Eol() + ;
//                "ENDERECO: " + mENDER + hb_Eol() + ;
//                "NUMERO: " + XmlNode(m->leitura, "nro") + hb_Eol() + ;
//                "BAIRRO: " + mBAIR + hb_Eol() + ;
//                "CIDADE: " + mCIDADE + hb_Eol() + ;
//                "UF: " + mUF + hb_Eol() + hb_Eol() ,"CONSULTA CADASTRO DE CONTRIBUINTE")
   ELSE
      hwg_MsgInfo("STATUS: " + XmlNode(cRetorno, "cStat") + hb_Eol() + "MOTIVO: " + XmlNode(cRetorno, "xMotivo") + hb_Eol()+ hb_Eol() ,"CONSULTA CADASTRO DE CONTRIBUINTE")
      IF XmlNode(cRetorno, "cStat") $ "259"
         mISENTO   :="9"
      ENDIF
   ENDIF
   ThisCAD:oEdit2:REFRESH()
   ThisCAD:oEdit1:REFRESH()
   ThisCAD:oEdit3:REFRESH()
   ThisCAD:oEdit8:REFRESH()   
   ThisCAD:oEdit9:REFRESH()   
   ThisCAD:oEdit11:REFRESH()
   ThisCAD:oEdit13:REFRESH()
   ThisCAD:oCombo2:SetItem( Ascan(aUF,mUF ) )
   ThisCAD:oCombo2:REFRESH()   
   ThisCAD:oCombo3:SetItem( Ascan(aMunicipios,RTRIM(mCIDADE) ) )
   ThisCAD:oCombo3:REFRESH()
RETURN
   
***********************************************************
static FUNCTION CADASTROCLIENTES_CONSULTA_CEP( mCEP )
***********************************************************
LOCAL oHttp, cXML, cCep
LOCAL cRes, cResTxt, cUf, cCidade, cTipo, cEnde, cBairro

DO WHILE .T.
   IF mCEP = '     -   ' .OR. mCEP = SPACE(09)
      hwg_MsgInfo(  "o CEP esta em branco, verifique!" )
      RETURN .F.
   ENDIF

   oHttp:= TIpClientHttp():new( "http://www.jpatecnologia.com.br/cep.asp?cep="+substr(mCEP,1,5)+'-'+substr(mCEP,7,3)+"&clipper=1" )
   IF ! oHttp:open()
      hwg_MsgInfo(  "Erro na conecção: "+ oHttp:lastErrorMessage() )
      RETURN .T.
   ENDIF
   cXML := oHttp:readAll()
   oHttp:close()

   IF Empty(cXML)
**      hwg_MsgInfo( "Ocorreu um erro inesperado. Tente outro CEP...")
      return .t.
   ENDIF

   MEMVAR->Uf          := XmlNode(cXml, "uf")
   MEMVAR->CIDADE      := XmlNode(cXml, "cidade")
   MEMVAR->ENDER      := XmlNode(cXml, "logradouro")
   MEMVAR->BAIR      := XmlNode(cXml, "bairro")

   ThisCAD:oEdit8:REFRESH()
   ThisCAD:oEdit9:REFRESH()
   ThisCAD:oEdit11:REFRESH()
   ThisCAD:oEdit13:REFRESH()
   ThisCAD:oCombo2:SetItem( Ascan(aUF,MEMVAR->Uf ) )
   ThisCAD:oCombo2:REFRESH()   
   ThisCAD:oCombo3:SetItem( Ascan(aMunicipios,MEMVAR->CIDADE ) )
   ThisCAD:oCombo3:REFRESH()
   
   return .T.
   
ENDDO
*****************************************
STATIC FUNCTION oEdit10_onLostFocus( )
*****************************************
   IF LEN(RTRIM(MEMVAR->FONE)) = 0
       RETURN .T.
   ENDIF
   IF LEN(RTRIM(MEMVAR->FONE)) < 10
       hwg_MsgInfo("FORMATO DE NUMERO DE TELEFONE INVALIDO"+ HB_EOL()+ HB_EOL() + "DEVE CONTER NO MINIMO 10 DIGITOS")
       RETURN .F.
   ENDIF
RETURN .T.

*****************************************
STATIC FUNCTION oCombo6_onChange( valor )
*****************************************

   IF substr(valor,1,1) = "0"
       ThisCAD:oedit18:Enable()
       ThisCAD:oedit12:Enable()
   ELSE
       ThisCAD:oedit18:Disable()
       ThisCAD:oedit12:Disable()
   ENDIF

RETURN
********************************************
STATIC FUNCTION oEdit18_onInit( valor )
********************************************
   IF substr(valor,1,1) = "0"
             ThisCAD:oedit18:Enable()
             ThisCAD:oedit12:Enable()
         ELSE
             ThisCAD:oedit18:Disable()
             ThisCAD:oedit12:Disable()
         ENDIF
      RETURN
************************************************************       
STATIC FUNCTION VERIFICA_CPFCNPJ( oDlg, oServer )
************************************************************   
LOCAL cQuery;
   , oQuery_cpfcnpj;

   IF RTRIM(MEMVAR->CPFCGC) # RTRIM(MEMVAR->CPFCGC_ANT)
      IF LEN(RTRIM(MEMVAR->CPFCGC)) < 12
         IF !VDV2(MEMVAR->CPFCGC)
            RETURN .F.
         ENDIF
      ELSE
         IF !VCGC(MEMVAR->CPFCGC)
            RETURN .F.
         ENDIF
      ENDIF
      
      cQuery          := "SELECT CLIENTES_NRAZ_SOC, CLIENTES_CPFCGC FROM CLIENTES WHERE CLIENTES_CPFCGC = " + MEMVAR->CPFCGC
      oQuery_cpfcnpj    := oServer:Execute(cQuery)
      
      IF ! oQuery_cpfcnpj:Eof()
         hwg_MsgInfo("CPF/CNPJ já existe no cadastro" + HB_EOL() + oQuery_cpfcnpj:Fields( "CLIENTES_NRAZ_SOC" ):Value +HB_EOL() + "CNPJ/CPF: "+ oQuery_cpfcnpj:Fields( "CLIENTES_CPFCGC" ):Value, "Atenção !!!")
         IF PERG( "Continua a Fazer o Cadastro com CNPJ/CPF já cadastrado ?" ) = "N"
            oQuery_cpfcnpj:close()
            RETURN .F.
         ENDIF
      ENDIF
      oQuery_cpfcnpj:close()   
   ENDIF
   
RETURN .T.
********************************************
STATIC FUNCTION oEdit3_onLostFocus
********************************************
*   If mINSEST != Space(15)
*          If ! ValidIE( Rtrim(mINSEST), mUF )
*               hwg_MsgInfo("INSCRICAO ESTADUAL INVALIDA"+ HB_EOL() )
*               Return .F.
*           ENDIF
*       Endif
    Return .T.
   
****************************************************************************************
STATIC FUNCTION SALVA_CLIENTES( oServer, cClientes_Id, cAcao )
****************************************************************************************
LOCAL oPAIS, oUF, oCIDADE;
   , cQuery1;
   , cQuery2;

   IF cAcao = 'INCLUIR'
      cQuery1   :="INSERT INTO CLIENTES ( "
      cQuery2   :=" VALUES ("
      
      cQuery1 += "CLIENTES_TIPCLI, "
      cQuery2   += "'" + strzero(MEMVAR->TIPCLI,1,0) + "', "
      
      cQuery1 += "CLIENTES_NRAZ_SOC, "
      cQuery2   +="'" + rtrim(TIRACENTO(upper(MEMVAR->NRAZ_SOC))) + "', "
      
      cQuery1 += "CLIENTES_TIPDOC, "
      IF  LEN(RTRIM(MEMVAR->CPFCGC)) < 12   
         cQuery2   +="'1', "
      ELSE
         cQuery2   +="'2', "
      ENDIF

      
      IF ! EMPTY(MEMVAR->CPFCGC)
         cQuery1 += "CLIENTES_CPFCGC, "
         cQuery2   +="'" + rtrim(MEMVAR->CPFCGC) + "', "
      ENDIF
      
      
      IF ! EMPTY(MEMVAR->INSEST)
         cQuery1 += "CLIENTES_INSEST, "
         cQuery2   +="'" + rtrim(MEMVAR->INSEST) + "', "
      ENDIF
      
      
      IF ! EMPTY(MEMVAR->INSMUN)
         cQuery1 += "CLIENTES_INSMUN, "
         cQuery2   +="'" + rtrim(MEMVAR->INSMUN) + "', "
      ENDIF

      IF nCombo1 = 0
         nCombo1 := 1
      ENDIF      
      cQuery1 += "CLIENTES_ISENTO, "
      cQuery2   +="'" + SUBSTR(aISENTO[nCombo1],1,1) + "', "

      IF ! EMPTY(MEMVAR->SUFRAMA)
         cQuery1 += "CLIENTES_SUFRAMA, "
         cQuery2   +="'" + rtrim(MEMVAR->SUFRAMA) + "', "
      ENDIF

      IF ! EMPTY(MEMVAR->EMAIL)
         IF EMAIL_VALIDO(MEMVAR->EMAIL)
            cQuery1 += "CLIENTES_EMAIL, "
            cQuery2   +="'" + rtrim(MEMVAR->EMAIL) + "', "
         endif
      ENDIF   
      
      IF ! EMPTY(MEMVAR->ENDER)
         cQuery1 += "CLIENTES_ENDER, "
         cQuery2   +="'" + rtrim(MEMVAR->ENDER) + "', "
      ENDIF   

      cQuery1 += "CLIENTES_NUMERO, "
      cQuery2   +="'" + strzero(MEMVAR->NUMERO,9,0) + "', "
      
      IF ! EMPTY(MEMVAR->COMPLEM)
         cQuery1 += "CLIENTES_COMPLEM, "
         cQuery2   +="'" + rtrim(MEMVAR->COMPLEM) + "', "
      ENDIF

      
      IF ! EMPTY(MEMVAR->BAIR)
         cQuery1 += "CLIENTES_BAIR, "
         cQuery2   +="'" + rtrim(MEMVAR->BAIR) + "', "
      ENDIF

      
      IF ! EMPTY(MEMVAR->CEP)
         cQuery1 += "CLIENTES_CEP, "
         cQuery2   +="'" + rtrim(MEMVAR->CEP) + "', "
      ENDIF
      
      
      cQuery1 += "CLIENTES_PAIS, "
      cQuery2 += "'" + aPAIS[nCombo4] + "', "

      
      FOR EACH oPAIS IN SEFAZ_CIDADE
         IF oPAIS[3] == aPAIS[nCombo4]
            cQuery1 += "CLIENTES_CODPAIS, "
            cQuery2 += "'" + SUBSTR(oPAIS[2],3,4) + "', "
         ENDIF
      NEXT             
      
      cQuery1 += "CLIENTES_UF, "
      cQuery2 += "'"   + aUF[nCombo2] + "', " 

      cQuery1 += "CLIENTES_CIDADE, "
      cQuery2 += "'" + aMunicipios[nCombo3] + "', " 

      
      FOR EACH oCIDADE IN SEFAZ_CIDADE
         IF oCIDADE[1] == aUF[nCombo2] .AND. oCIDADE[3] == aMunicipios[nCombo3]
            cQuery1 += "CLIENTES_CODMUN, "
            cQuery2 += "'"   + oCIDADE[2] + "', "
         ENDIF
      NEXT

      cQuery1 += "CLIENTES_FONE, "
      cQuery2   +="'" + rtrim(MEMVAR->FONE) + "', "
      
      cQuery1 += "CLIENTES_CONTATO, "
      cQuery2   +="'" + rtrim(MEMVAR->CONTATO) + "', "
      
      cQuery1 += "CLIENTES_LIMCRE, "
      cQuery2   +="'" + strzero(MEMVAR->LIMCRE,14,2) + "', "
      
      cQuery1 += "CLIENTES_TOTCRE, "
      cQuery2   +="'" + strzero(MEMVAR->TOTCRE,14,2) + "', "
      
      cQuery1 += "CLIENTES_VENBLO, "
      cQuery2   +="'" + SUBSTR(aVENBLO[nCombo6],1,1) + "', "
      
      cQuery1 += "CLIENTES_DATCAD, "
      cQuery2   +="'" + strzero(year(MEMVAR->DATCAD),4,0) + "-" + strzero(month(MEMVAR->DATCAD),2,0) + "-" + strzero(day(MEMVAR->DATCAD),2,0) + "', "
      
      cQuery1 += "CLIENTES_DATALT, "
      cQuery2   +="'" + strzero(year(MEMVAR->DATALT),4,0) + "-" + strzero(month(MEMVAR->DATALT),2,0) + "-" + strzero(day(MEMVAR->DATALT),2,0) + "', "
      
      cQuery1 += "CLIENTES_USUALT, "
      cQuery2   +="'" + rtrim(MEMVAR->USUALT) + "', "
      
      cQuery1 += "CLIENTES_TAXCLI, "
      cQuery2   +="'" + strzero(MEMVAR->TAXCLI,5,2) + "', "
      
      cQuery1 += "CLIENTES_NUMPAR, "
      cQuery2   +="'" + strzero(MEMVAR->NUMPAR,2,0) + "', "
      
      cQuery1 += "CLIENTES_PERDES, "
      cQuery2   +="'" + strzero(MEMVAR->PERDES,5,2) + "', "
      
      cQuery1 += "CLIENTES_VALMIN, "
      cQuery2   +="'" + strzero(MEMVAR->VALMIN,5,0) + "', "
      
      cQuery1 += "CLIENTES_QUEM_BLOQ ) "
      cQuery2   +="'" + rtrim(M->OPERADOR)+"/"+rtrim(hwg_GetComputerName()+" ["+dtoc(M->DAT_HOJE)+" "+time()+"]") + "' )"
      
//      HB_GTINFO( HB_GTI_CLIPBOARDDATA, cQuery1+cQuery2)
      
      oQuery := oServer:Execute(cQuery1+cQuery2)
            
   ELSE
      cQuery1   :="UPDATE CLIENTES SET "
      cQuery1  +="CLIENTES_TIPCLI = '" + strzero(MEMVAR->TIPCLI,1,0) + "', "
            
      IF strzero(M->NIV_ACESSO,1,0)$"89"      
         cQuery1 += "CLIENTES_NRAZ_SOC = '"   + rtrim(TIRACENTO(upper(MEMVAR->NRAZ_SOC))) + "', "
      ENDIF
      
      IF  LEN(RTRIM(MEMVAR->CPFCGC)) < 12
         cQuery1 += "CLIENTES_TIPDOC ='1', "
      ELSE
         cQuery1 += "CLIENTES_TIPDOC ='2', "
      ENDIF
      
      IF ! EMPTY(MEMVAR->CPFCGC)
         cQuery1 += "CLIENTES_CPFCGC = '"   + rtrim(MEMVAR->CPFCGC) + "', "
      ENDIF
      IF ! EMPTY(MEMVAR->INSEST)
         cQuery1 += "CLIENTES_INSEST = '" + rtrim(MEMVAR->INSEST) + "', "
      ENDIF
      IF ! EMPTY(MEMVAR->INSMUN)
         cQuery1 += "CLIENTES_INSMUN = '" + rtrim(MEMVAR->INSMUN) + "', "
      ENDIF
            
      IF nCombo1 = 0
         nCombo1 := 1
      ENDIF      
      
      cQuery1 += "CLIENTES_ISENTO = '" + SUBSTR(aISENTO[nCombo1],1,1) + "', "

      IF ! EMPTY(MEMVAR->SUFRAMA)
         cQuery1 += "CLIENTES_SUFRAMA = '" + rtrim(MEMVAR->SUFRAMA) + "', "
      ENDIF
      
      IF ! EMPTY(MEMVAR->EMAIL)
         IF EMAIL_VALIDO(MEMVAR->EMAIL)
            cQuery1 += "CLIENTES_EMAIL = '" + rtrim(LOWER(MEMVAR->EMAIL)) + "', "
         endif
      ENDIF

      IF ! EMPTY(MEMVAR->ENDER)
         cQuery1 += "CLIENTES_ENDER = '" + rtrim(MEMVAR->ENDER) + "', "
      ENDIF
      
      cQuery1 += "CLIENTES_NUMERO = '" + strzero(MEMVAR->NUMERO,9,0) + "', "
      
      IF ! EMPTY(MEMVAR->COMPLEM)
         cQuery1 += "CLIENTES_COMPLEM = '" + rtrim(MEMVAR->COMPLEM) + "', "
      ENDIF
      
      IF ! EMPTY(MEMVAR->BAIR)
         cQuery1 += "CLIENTES_BAIR = '" + rtrim(MEMVAR->BAIR) + "', "
      ENDIF   

      cQuery1 += "CLIENTES_CEP = '" + MEMVAR->CEP + "', "
       cQuery1 += "CLIENTES_PAIS = '" + aPAIS[nCombo4] + "', "
      
      FOR EACH oPAIS IN SEFAZ_CIDADE
         IF oPAIS[3] == aPAIS[nCombo4]
            cQuery1 += "CLIENTES_CODPAIS = '" + SUBSTR(oPAIS[2],3,4) + "', "
         ENDIF
      NEXT             
            
      cQuery1 += "CLIENTES_UF = '"   + aUF[nCombo2] + "', " 
      
      FOR EACH oCIDADE IN SEFAZ_CIDADE
         IF oCIDADE[1] == aUF[nCombo2] .AND. oCIDADE[3] == aMunicipios[nCombo3]
            cQuery1 += "CLIENTES_CODMUN = '"   + oCIDADE[2] + "', "
         ENDIF
      NEXT   
   
      cQuery1 += "CLIENTES_CIDADE = '" + aMunicipios[nCombo3] + "', "
      cQuery1 += "CLIENTES_FONE = '" +  rtrim(MEMVAR->FONE) + "', "
      
      IF ! EMPTY(MEMVAR->CONTATO)
         cQuery1 += "CLIENTES_CONTATO = '" + rtrim(MEMVAR->CONTATO) + "', "
      endif
      
      cQuery1 += "CLIENTES_LIMCRE = '"   + strzero(MEMVAR->LIMCRE,14,2) + "', "
      cQuery1 += "CLIENTES_TOTCRE = '"   + strzero(MEMVAR->TOTCRE,14,2) + "', "
      cQuery1 += "CLIENTES_VENBLO = '"   + SUBSTR(aVENBLO[nCombo6],1,1) + "', "
      cQuery1 += "CLIENTES_DATCAD = '"   + strzero(year(MEMVAR->DATCAD),4,0) + "-" + strzero(month(MEMVAR->DATCAD),2,0) + "-" + strzero(day(MEMVAR->DATCAD),2,0) + "', "
      cQuery1 += "CLIENTES_DATALT = '"   + strzero(year(MEMVAR->DATALT),4,0) + "-" + strzero(month(MEMVAR->DATALT),2,0) + "-" + strzero(day(MEMVAR->DATALT),2,0) + "', "
      cQuery1 += "CLIENTES_USUALT = '"   + rtrim(MEMVAR->USUALT) + "', "
      cQuery1 += "CLIENTES_TAXCLI = '"   + strzero(MEMVAR->TAXCLI,5,2) + "', "
      cQuery1 += "CLIENTES_NUMPAR = '"   + strzero(MEMVAR->NUMPAR,2,0) + "', "
      cQuery1 += "CLIENTES_PERDES = '"   + strzero(MEMVAR->PERDES,5,2) + "', "
      cQuery1 += "CLIENTES_VALMIN = '"   + strzero(MEMVAR->VALMIN,5,0) + "', "
      cQuery1 += "CLIENTES_QUEM_BLOQ = '" + rtrim(M->OPERADOR)+"/"+rtrim(hwg_GetComputerName()+" ["+dtoc(M->DAT_HOJE)+" "+time()+"]") + "' "
      cQuery1 += "WHERE CLIENTES_Id = '" + cClientes_Id + "'"

      
      oQuery := oServer:Execute(cQuery1)
      
   ENDIF

return NIL

*****************************************
STATIC Function EMAIL_VALIDO(cmail)
*****************************************
Local cRegEx

cRegEx :="^[\w-\.]{1,}\@([\da-zA-Z-_]{1,}\.){1,}[\da-zA-Z-_]{2,3}$"

IF HB_REGEXLIKE( cRegEx, RTrim(cmail) )
      RETURN .T.
ELSE
      RETURN .F.
ENDIF

************************************************************
STATIC FUNCTION RELATORIO_CLIENTES( )
************************************************************
   oPDF := PDFClass()
   IF oPDF == NIL
      hwg_msginfo("Falha da criação do objeto PDF")
      RETURN .F.
   ENDIF
   oPDF:cFileName    := "C:\TEMP\CLIENTES"+strzero(HB_RandomInt(1, 99999999),8,0)+'.PDF'
   IF ! oPDF:PrintOptions(  ); RETURN NIL; ENDIF
   
   DBSELECTAREA("CLIENTES")
   Ordsetfocus(2)
   CLIENTES->( DBGOTOP() )
   
   
   IF  oPDF:nPrinterType ==  PDFCLASS_LANDSCAPE
      
      oPDF:Begin()

      nLinha   := 100
      nPagina := 1
      
      DO WHILE ! EOF()
         IF    nLinha   > 96
            oPDF:AddPage()
            
            nMaxCol := oPDF:MaxCol()
            nMaxRow := oPDF:MaxRow()

            oPDF:DrawBox( 0, 0, 9, 41, Nil, Nil, Nil )                 // box esquerdo
            oPDF:DrawImageSize( 0.5, 0.5, 8, 39, "logotipo.jpg" )             // logotipo

            oPDF:DrawBox( 0, 41, 9, 117, Nil, Nil, Nil )  // box centro
            oPDF:DrawText( 2.0, 42, RTRIM(FLAG->n_xNome), nil, 10, "Helvetica-Bold", Nil, Nil )
            oPDF:DrawText( 3.5, 42, RTRIM(FLAG->n_xLgr) + ', ' + RTRIM(FLAG->n_nro), Nil, 8, "Helvetica", Nil, Nil )
            oPDF:DrawText( 5.0, 42,'BAIRRO - ' + RTRIM(FLAG->n_xBairro), Nil, 8, "Helvetica", Nil, Nil )
            oPDF:DrawText( 6.4, 42, "CEP " +FLAG->n_CEP + ' - ' + RTRIM(FLAG->n_xMun) + ' - ' + FLAG->n_xUF + " - FONE: " +FLAG->n_fone, Nil, 8, "Helvetica", Nil, Nil )
            oPDF:DrawText( 8.0, 42, 'CNPJ-'+RTRIM(FLAG->n_CNPJ) + '   Insc.Est.-' + RTRIM(FLAG->n_IE) , Nil, 8, "Helvetica-Bold", Nil, Nil )

            oPDF:DrawBox( 0, nMaxCol, 9, 41, Nil, Nil, Nil )  // box direito
            oPDF:DrawText( 2, 120, "CAD.CLIENTES      " , Nil, 10, "Helvetica", Nil, Nil )
            oPDF:DrawText( 4, 120, "PAGINA Nr.: " + STRZERO(nPagina,4,0), Nil, 10, "Helvetica", Nil, Nil )
            oPDF:DrawText( 6, 120, "DATA: " + DTOC(DAT_HOJE), Nil, 10, "Helvetica", Nil, Nil )
            oPDF:DrawText( 8, 120, "HORA: " + TIME(), Nil, 10, "Helvetica", Nil, Nil )

            oPDF:DrawBox( 9, 0, 12, nMaxCol, Nil, Nil, Nil ) 

            nLinha := 11
            nPagina += 1
            nHightLin:=3

            nLenItem := 20
            nLenUnit := 22
            nLenVlrUni := 27
            nLenDescri := ( nMaxCol - ( nLenItem + nLenUnit +  nLenVlrUni ) )
            
            oPDF:DrawText( nLinha, 1, "CODIGO", Nil, 10, "Helvetica", Nil, Nil )
            oPDF:DrawText( nLinha, 16, "NOME/RAZAO SOCIAL", Nil, 10, "Helvetica", Nil, Nil )

            nLinha += 3

         ENDIF
         
         
         oPDF:DrawText( nLinha, 1, CLIENTES->UCLIENTE, Nil, 12, "Courier-Bold", Nil, Nil )
         oPDF:DrawText( nLinha, 16, CLIENTES->NRAZ_SOC, Nil, 10, "Helvetica", Nil, Nil )
         nLinha += 2
         DBSKIP()
      ENDDO   
      
      oPDF:DrawLine( nLinha, 0, nLinha, nMaxCol, 1 )
      
      oPDF:End(  )
      
   ELSE 
   
      DBSELECTAREA("CLIENTES")
      Ordsetfocus(2)
      CLIENTES->( DBGOTOP() )
   
      oPDF:nPrinterType :=  WIN_PRINTERGETDEFAULT()
      oPDF:SetType( PDFCLASS_ROLLS )
      oPDF:Begin()
      oPDF:nPageHeight := 841.89
      oPDF:AddPage()
      nMaxCol := oPDF:MaxCol()

      oPDF:DrawImageSize( 0, 0, 4, 19, "logotipo.jpg" )             // logotipo

      oPDF:DrawText( 5, 0, RTRIM(FLAG->n_xNome), nil, 10, "Helvetica-Bold", Nil, Nil )
      oPDF:DrawText( 6, 0, RTRIM(FLAG->n_xLgr) + ', ' + RTRIM(FLAG->n_nro), Nil, 8, "Helvetica", Nil, Nil )
      oPDF:DrawText( 7, 0,'BAIRRO - ' + RTRIM(FLAG->n_xBairro), Nil, 8, "Helvetica", Nil, Nil )
      oPDF:DrawText( 8, 0, "CEP " +FLAG->n_CEP + ' - ' + RTRIM(FLAG->n_xMun) + ' - ' + FLAG->n_xUF + " - FONE: " +FLAG->n_fone, Nil, 8, "Helvetica", Nil, Nil )
      oPDF:DrawText( 9, 0, 'CNPJ-'+RTRIM(FLAG->n_CNPJ) + '   Insc.Est.-' + RTRIM(FLAG->n_IE) , Nil, 8, "Helvetica-Bold", Nil, Nil )
      oPDF:DrawLine( 9.5, 0, 9.5, nMaxCol, 1 )
      oPDF:DrawText( 10.5, 0, "CADASTRO DE CLIENTES", Nil, 10, "Helvetica-Bold", Nil, Nil )   
      oPDF:DrawText( 11.5, 0, "CODIGO  NOME/RAZAO SOCIAL", Nil, 8, "Helvetica", Nil, Nil )   
      oPDF:DrawLine( 12, 0, 12, nMaxCol, 1 )
      
      
      nLinha     := 13
      nLenItem := 20
      nLenUnit := 7
      nLenVlrUni := 19
      nLenDescri := ( nMaxCol - ( nLenItem + nLenUnit +  nLenVlrUni ) )
         
      DO WHILE ! EOF()   
      
         IF    nLinha   > 70
            oPDF:AddPage()
            nLinha   := 0
         ENDIF
         
         oPDF:DrawText( nLinha, 0, CLIENTES->UCLIENTE, Nil, 08, "Helvetica", Nil, Nil )
         oPDF:DrawText( nLinha++, 7, CLIENTES->NRAZ_SOC, Nil, 08, "Helvetica", Nil, Nil )
         CLIENTES->(DBSKIP())
   
      ENDDO   

      oPDF:End(  )   

   ENDIF
   
   
   oPDF:PrintPreview(  )

RETURN NIL   



tela.jpg


tela.jpg
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

Browse com ADO

Mensagempor gilbertosilverio » 07 Abr 2020 14:39

Ola Amigos,

Baseado neste exemplo do Fernando, consegui entender e fazer alguns testes com SQL.

Depois de tentar por um bom tempo, vi que meu erro estava na conexão com o banco de dados, por mais que fizesse não conseguia conectar.

O meu maior erro, um erro de principiante e estar compilando com 32bits e estar tentando conectar com 64... kkkk

Mais agora estou com uma duvida:

Instalei em minha maquina o MariaDb e o driver mariaodbc 3.1, conforme o exemplo do Fernando, só que no meu servidor existem outros drivers ODBC, e e ai te enrosquei de novo.

Qual driver usar e onde consigo as configurações para a minha comunicação com o banco de dados funcionar.

No meu servidor um W2008 estão instalados estes drivers, qual devo usar ou posso simplesmente instalar o Mariaodbc 3.1, sendo que no server tem o SQL e o MYSQL, que são usados por outros aplicativos.

Vou precisar conectar com outro server linux usando ubuntu, onde esta instalado o MYSQL, da minha maquina consigo conectar com o OBDC do mariadb, posso instalar este drive la no meu w2008 e não vou derrubar os outros sistemas.

Encontrei aqui no forum diversas configurações, mais fiquei em duvida qual usar.

Ja pesquisei muito, encontrei muita coisa, e nada me ajudou a entender.

Agradeço a ajuda.
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 com ADO

Mensagempor JoséQuintas » 07 Abr 2020 17:43

O interessante do driver do MariaDB 3.1, é que ele conecta com todos.

Quem precisa do ODBC é o aplicativo, não o servidor.
Só vai instalar no servidor se rodar o aplicativo nele.

ODBC 32 bits pra aplicativo 32 bits - APLICATIVO 32 BITS (não tem a ver com sistema operacional aqui).

Cada um é independente. Pode instalar todos esses, e ir removendo o que está fora de uso.
NÃO atrapalha ter vários, mas vai indicar no aplicativo qual está usando, e esse sim precisa estar instalado.
É PELO NOME, NÃO TEM substituição automática, vai ser usado exatamente o nome que colocar no aplicativo.
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Browse com ADO

Mensagempor gilbertosilverio » 07 Abr 2020 19:12

Quintas,

Muito obrigado.

Instalei no w2008 o Odbc do Mariadb e funcionou perfeitamente, consegui me conectar com o outro servidor linux onde estão as bases de dados que necessito.
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 com ADO

Mensagempor Itamar M. Lins Jr. » 11 Abr 2020 15:19

Ola!
90% dos meus browses não são editáveis.
Funciona dessa forma conforme exemplo do Fernando.
Acredito que usando SQLMIX, não vamos precisar de alguns códigos. Vamos diminuir consideravelmente. Eu quero usar acesso nativo com SQLMIX, mas está dando erro na hora de criar a lib no HB_3.4.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Browse com ADO

Mensagempor Itamar M. Lins Jr. » 11 Abr 2020 15:26

Ola!
Tem que criar o browse da mesma forma que fazemos com HTML.
Temos que usar a "flag" LIMITE no código SQL e no browse guardar a posição. Chamar 50 de cada vez, senão fica horrível, nem funciona, precisamos PAGINAR, as consultas SQL com mais de 10 mil registros por exemplo, não podemos chamar tudo de vez.
Esse são os detalhes, o pulo do gato que ainda não vi, e as consultas PAI->FILHO de milhares de NFe por exemplo.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Browse com ADO

Mensagempor Fernando queiroz » 11 Abr 2020 22:14

Itamar M. Lins Jr. escreveu:Ola!
Tem que criar o browse da mesma forma que fazemos com HTML.
Temos que usar a "flag" LIMITE no código SQL e no browse guardar a posição. Chamar 50 de cada vez, senão fica horrível, nem funciona, precisamos PAGINAR, as consultas SQL com mais de 10 mil registros por exemplo, não podemos chamar tudo de vez.
Esse são os detalhes, o pulo do gato que ainda não vi, e as consultas PAI->FILHO de milhares de NFe por exemplo.

Saudações,
Itamar M. Lins Jr.


Itamar tenho carregado no máximo 500 registro, deixando a consulta trazer os específicos, fiz teste de carga via internet e ficou com um tempo admissível , se a conexão estiver muito ruim podemos ate baixar a quantidade para 100 registros, no geral o cliente faz um filtro nas telas de consulta.

no caso de relatórios ou processos com todos os registro ainda nao testei
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

Browse com ADO

Mensagempor JoséQuintas » 12 Abr 2020 11:41

Itamar M. Lins Jr. escreveu:Tem que criar o browse da mesma forma que fazemos com HTML.
Temos que usar a "flag" LIMITE no código SQL e no browse guardar a posição.
Chamar 50 de cada vez, senão fica horrível, nem funciona, precisamos PAGINAR, as consultas SQL com mais de 10 mil registros por exemplo, não podemos chamar tudo de vez.Esse são os detalhes, o pulo do gato que ainda não vi, e as consultas PAI->FILHO de milhares de NFe por exemplo.


50 de cada vez? acho que tá brincando
Tenho limitado a 2.000, mas por causa de relacionamento entre campos numéricos/não numéricos.
pai e filho? do tipo pedido e produtos? só fazer o comando SQL.

No caso do ADO, o pulo do gato é fazer tudo com ADO, SEM CONVERSÃO.
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Browse com ADO

Mensagempor Itamar M. Lins Jr. » 12 Abr 2020 14:10

Ola!
50 de cada vez? acho que tá brincando

Isso vai depender da quantidade de fields(campos) que tem nesses 50 registros. Mas mesmo assim, não quis dizer exatamente 50, pode ser mais...
Meu cadastro de clientes é enorme, tem fields para dar e vender...
do tipo pedido e produtos? só fazer o comando SQL.

É isso, mas tem gente que edita no browse. Ai depois que edita, tem que salvar. Com DBF não tem botão salvar, entendeu ?

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Browse com ADO

Mensagempor JoséQuintas » 13 Abr 2020 09:21

Itamar M. Lins Jr. escreveu:Meu cadastro de clientes é enorme, tem fields para dar e vender...


Mas aí que está o ponto.
Porque o browse de todos os campos?
Porque essa mania antiga de editar limitado no próprio browse?
Normalmente browse é pra pesquisa, e não pra ficar alterando, salvo exceções.
O ganho de velocidade é justamente em trazer somente o que precisa, e nada mais, e é justamente aí que o DBF perde, porque trás sempre TUDO.
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: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Browse com ADO

Mensagempor asimoes » 13 Abr 2020 09:44

Nas minhas Grids eu coloco os campos chaves da consulta e os demais eu coloco em uma janela dialog, fica ruim a visualização de muitas colunas na grid.

Exemplo: CPF, NOME, TELEFONE se o usuário der um duplo click abre uma janela modal com o restante do cadastro, aproveitando o mesmo resultset

Se precisar editar, a própria janela modal está habilitada para isso, nada de edição na grid

A grid que eu uso é com vetor, não uso BROWSE DBF
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Browse com ADO

Mensagempor Itamar M. Lins Jr. » 13 Abr 2020 10:26

Ola!
, e é justamente aí que o DBF perde, porque trás sempre TUDO.

Não, no browse só traz o que cabe nas linhas do browse. Usando LetoDbf é assim.
Isso é um problema da rede mapeada, usando servidores de DBF, NetIO, LetoDbf, ADS, isso não "ecziste"
Como eu disse, normalmente eu não edito no browse. Mas existe essa possibilidade.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Anterior Próximo



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

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