Jump to content
Fivewin Brasil

Xbrowse limitar quantidade de registros


sunset

Recommended Posts

Bom Dia

Existe alguma forma de limitar a quantidade de registros a serem exibidos quando iniciar o XBROWSE, estou com uma base com 41.523.181 registros, quando inicio a tela com o xbrowse, praticamente fica 2h travada, com toda certeza é a quantidade de registros, então gostaria de saber se tenho como limitar esse carregamento com algum argumento no xbrowse para ele tipo carregar uns 5.000 e depois ir paginando e carregando a medida que for navegando na base, uso mysql.

 

grato.

image.png.2056a6589db11fc1a4c77c97d2f7c174.png

Link to comment
Share on other sites

Olá, 

Se você está utilizando banco de dados MySQL, o comando apresentado pelo Wellington, no post acima, atende. 

SELECT ( campos ) FROM ( tabela ) LIMIT ( número de registros )

Se estiver utilizando DBF, faça um set filter para apresentar um número reduzido de registros, como por exemplo de data x até data y.

Att.,

Oliveiros Junior

 

 

Link to comment
Share on other sites

MYSQL 5.7

Na verdade eu estou abrindo a tabela como se fosse um DBF ainda 

           use estadual alias estad new shared
           if neterr()
              msginfo("Arquivo está em uso em modo exclusivo","Informação")
              close data
              retu
           endif
           set index to estadual
       

e usando o ALIS no xbrwse

 

    @ 0,0 XBROWSE oLbxEstadual          ;
                    Fields Iif(len(alltrim(estad->numecgc)) = 11,TRANSFORM(estad->numecgc,"@R 999.999.999-99"),TRANSFORM(estad->numecgc,"@R 99.999.999/9999-99")),;
                             estad->nomecli            ,;
                             estad->inscest            ,;
                             estad->siticms            ,;
                            estad->cida_de            ,;
                             estad->esta_do            ,;
                             estad->correio            ,;
                             estad->telefon             ;
                             Headers "Cnpj"            ,;
                             "Nome"                        ,;
                             "Inscrição"                ,;
                             "Situação"                   ,;
                             "Cidade"                    ,;
                             "UF"                           ,;
                             "Correio"                   ,;
                             "Telefone"                    ;
                             Fieldsizes 170,400,90,100,200,25,400,150;
                             Alias "estad"                  ;

 

Mas acredito que desta forma não vou ter resultado, vou executar um SELECT conforme indicado teria que colocar o resultado num array ?

 

 

Link to comment
Share on other sites

Um exemplo de SELECT com paginação para SQLRDD, especificamente na função GetVndList(...)

/******************************************************************************
* Nome do PRG: cadvendas  (Criada em 11/05/2020) - ARSOFT INFROMÁTICA         *
* Função.....: Módulo para consulta de vendas no BD remoto (online)           *
* Autor......: Ariston Santos                                                 *
* Site.......: http://www.arsoft-ap.com.br                                    *
* Contato....: ariston.ap@hotmail.com; suporte@arsoft-ap.com.br               *
******************************************************************************/

#include "FiveWin.ch"
#include "xbrowse.ch"
#include "vlib.ch"

*--- (SqlRDD includes ) ---*
#include "sqlrdd.ch"
#include "firebird.ch"

STATIC aVndInf, aOcpItn, aVndNul, aVndColWd, aVndSavWd, aNfColWd2, aNfSavW2, cQPesq, cCPesq
STATIC cVndQry, cVndQpg, cVndQrc, cVndSkp, cVndLsk
STATIC xVa01, xItn02, xItn03, xItn04, xItn05, xItn06, xItn07, xItn08, xItn09, xItn10, xItn11, xItn12, xItn13, xItn14, xItn15, xItn16, xItn17, xItn18, xItn19, xItn20,;
       xItn21, xItn22, xItn23, xItn24, xItn25, xItn26, xItn27, xItn28, xItn29, xItn30, xItn31, xItn32, xItn33, xItn34, xItn35, xItn36, xItn37, xItn38, xItn39, xItn40,;
       xItn41, xItn42, xItn43, xItn44, xItn45, xItn46, xItn47, xItn48, xItn49, xItn50, xItn51, xItn52, xItn53, xItn54, xItn55, xItn56, xItn57, xItn58, xItn59, xItn60, xItn61

FUNCTION CtrlVendas()
   n_Conn := nConection(.F., .F.)
   IF n_Conn <= 0 ; RETURN NIL ; ENDIF

   aVndNul := {}
   aVndInf := {}

   aLetra := {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"}

   cCPesq := SPACE(50)
   cQPesq := "Nome cliente"
   aQPesq := {"Nome cliente", "Fantasia", "CPF/CNPJ", "Nome vendedor", "Data venda", "Data entrega", "Código venda", "Cód. cliente", "Cód. vendedor"}
   cVndQrc := 0
   cVndQpg := 0
   cVndLsk := 0
   cVndSkp := 0
   
   GetVndList(0,"*","",NIL,NIL,.f.,"New")
   IF LenArray(aVndInf,30) > 0
      aOcpItn := OrdGetItms(aVndInf[1,1], aVndInf[1,2])
   ELSE
      aOcpItn := OrdGetItms(0, "")
   ENDIF

   DEFINE FONT oDFont NAME "TAHOMA" SIZE 0, -13
   DEFINE FONT oFBold NAME "Verdana" SIZE 0, -14 BOLD
   DEFINE FONT oXBfon NAME "Arial Narrow" SIZE 0,-15

   XBrNumFormat( 'E', .t. )

   SysRefresh()
   DEFINE DIALOG oCadDlg FROM 0, 0 TO 35, 100 TITLE "Consulta de venda online"
   oCadDlg:lHelpIcon := .f.

   @02,005 SAY oSayPsq PROMPT "Procurar por:" OF oCadDlg SIZE 70,10 PIXEL
   @12,005 COMBOBOX oCBox VAR cQPesq ITEMS aQPesq SIZE 70, 50 PIXEL OF oCadDlg

   @02,080 SAY "Procurar (Asterisco '*' para mostrar todos os registros)" OF oCadDlg SIZE 310,10 PIXEL
   @12,080 GET oGetPsq VAR cCPesq OF oCadDlg SIZE 310,12 PIXEL UPDATE VALID GetVndList(1,@cCPesq,"",oXbVnd,oCadDlg,.t.,"New")

   @25,05 TABS oPTabs PROMPTS "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z" OF oCadDlg ;
          PIXEL SIZE 385.00, 20.00 ACTION (cCPesq := aLetra[oPTabs:nOption], GetVndList(2,@cCPesq,"",oXbVnd,oCadDlg,.f.,"New"), EVAL({||oXbItn:bChange}), IIF(LEN(aVndInf)=0,(aOcpItn := OrdGetItms(0, ""),oXbItn:SetArray(aOcpItn), oXbItn:MakeTotals(), oXbItn:Refresh()),NIL)) // TABS provide nOption automatically
          oPTabs:cToolTip := "Filtar apelido ou nome que inicie por esta letra"

   aVndColWd := array(61) // Qtd de colunas
                * 7,  8, 25,  16,  17, 24,  29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,  50, 51,  52;
   aVndColWd := {60, 30, 70, 250, 150, 80, 120, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 150, 25, 150}
   @33,05 GROUP oGrp PROMPT "" OF oCadDlg SIZE 385, 125
   @33,05 XBROWSE oXbVnd OF oCadDlg SIZE 284, 125 PIXEL ARRAY aVndInf ;
          COLUMNS "", 8, 25, 16, 17, 25, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 51, 52;
          HEADERS "Data", "Hora", "Doc. cliente", "Nome/Razão social do cliente", "Fantasia/Local de trabalho do cliente", "CPF/CNPJ", "Operação", "Vlr. Itens", "Desconto itens", "Desconto final", "Acréscimo %", "Mão de obra R$", "Couvert R$", "Meio Pg 01", "Meio Pg 02", "Meio Pg 03", "Meio Pg 04", "Meio Pg 05", "Meio Pg 06", "Meio Pg 07", "Meio Pg 08", "Meio Pg 09", "Meio Pg 10", "Meio Pg 11", "Operador", "Cód. vendedor", "Nome vendedor";
          COLSIZES aVndColWd ;
          ON CHANGE (aOcpItn := OrdGetItms(aVndInf[oXbVnd:nArrayAt,1], aVndInf[oXbVnd:nArrayAt,2]), oXbItn:SetArray(aOcpItn), oXbItn:MakeTotals(), oXbItn:Refresh()) ;
          ON DBLCLICK EditVnd(.f., oXbVnd) ;
          COLORS CLR_BLACK, nRGB(240,248,255) ;
          LINES CELL UPDATE
   AEval( oXbVnd:aCols, { |o| o:nHeadStrAlign := AL_LEFT } )
   oXbVnd:lRecordSelector := .F.
   oXbVnd:lColDividerComplete := .T.
   oXbVnd:lKineticBrw := .f.
   oXbVnd:SetFont(oXBfon)
   oXbVnd:bClrSelFocus := {|| { CLR_WHITE, CLR_HBLUE }} // Seleção com foco
   oXbVnd:bClrSel      := {|| { CLR_BLACK, CLR_GRAY }} // Seleção sem foco
   oXbVnd:bClrStd      := {|| If( LenArray(aVndInf,1) > 0 .AND. MOD(oXbVnd:nArrayAt, 2) = 0, ; // Cores diferentes em itens bloqueados
                                { CLR_BLACK, CLR_HCYAN },;
                                { CLR_BLACK, nRGB(240,248,255) } ) }

   IF LEN(aVndInf) > 0
      WITH OBJECT oXbVnd
         :aCols[1]:bStrData := {||DTOC(aVndInf[oXbVnd:nArrayAt,7])}
      END
   ENDIF

   oXbVnd:CreateFromCode()
   aVndSavWd := oXbVnd:nWidth

   * XBROWSE dos itens
   aNfColWd2 := {110, 320, 75, 75, 75, 75, 75, 75, 75}
   @163,05 GROUP oGrp02 PROMPT "" OF oCadDlg SIZE 385, 70
   @163,05 XBROWSE oXbItn ARRAY aOcpItn OF oCadDlg ;
           HEADERS "Código", "Descrição", "Quantidade", "Pr. s/desc", "Pr c/desc.", "Vlr. Total", "Nr. lote", "Fabricação", "Validade";
           COLUMNS {1,2,3,4,5,6,7,8,9} ;
           COLSIZES aNfColWd2 ;
           COLORS CLR_BLACK, nRGB(240,248,255) ;
           SIZE 385, 70 PIXEL LINES CELL UPDATE

           oXbItn:bClrSelFocus := {|| { CLR_WHITE, CLR_HBLUE }} // Seleção com foco
           oXbItn:bClrSel      := {|| { CLR_BLACK, CLR_HGRAY }} // Seleção sem foco
           oXbItn:bClrStd      := {|| If( MOD(oXbItn:nArrayAt, 2) = 0,  {CLR_BLACK, CLR_HCYAN}, {CLR_BLACK, nRGB(240,248,255)} ) }
           oXbItn:lRecordSelector := .F.
           oXbItn:lColDividerComplete := .T.
           oXbItn:lKineticBrw := .f.
           AEval( oXbItn:aCols, { |o| o:nHeadStrAlign := AL_LEFT } )
           oXbItn:SetFont(oXBfon)
           oXbItn:CreateFromCode()
           aNfSavW2 := oXbItn:nWidth
           oXbItn:lFooter := .t.
           oXbItn:aCols[5]:cFooter := "TOTAL >>"
           oXbItn:aCols[6]:nFooterType := AGGR_TOTAL
           oXbItn:nStretchCol  := STRETCHCOL_WIDEST
           oXbItn:ColStretch()


   nCol := 55
   @242, (8+(nCol*1)-55) SBUTTON oSbt1 PROMPT "" OF oCadDlg SIZE 50, 18 PIXEL NOBORDER XP ACTION NIL WHEN .F. // EditVnd(.t., oXbVnd)
   @242, (8+(nCol*2)-55) SBUTTON oSbt2 PROMPT "" OF oCadDlg SIZE 50, 18 PIXEL NOBORDER XP ACTION NIL WHEN .F. // EditVnd(.f., oXbVnd)
   @242, (8+(nCol*3)-55) SBUTTON oSbt4 PROMPT "" OF oCadDlg SIZE 50, 18 PIXEL NOBORDER XP ACTION NIL WHEN .F. // DeleVnd(oXbVnd)
   @242, (8+(nCol*4)-55) SBUTTON oSbt3 PROMPT "Relatório" OF oCadDlg FILENAME ".\FIGURAS\print.BMP" SIZE 50, 18 PIXEL NOBORDER XP ACTION ImprVnd(oXbVnd)

   @242, 230 SBUTTON oSbPg1 PROMPT " " OF oCadDlg ACTION GetVndList(4,"<","",oXbVnd,oCadDlg,.f.,"New") FILENAME ".\figuras\pgup.bmp"   SIZE 18, 18 PIXEL NOBORDER XP TOOLTIP "Mostrar registros da primeira página"
   @242, 250 SBUTTON oSbPg2 PROMPT " " OF oCadDlg ACTION GetVndList(4,"-","",oXbVnd,oCadDlg,.f.,"New") FILENAME ".\figuras\skip-1.bmp" SIZE 18, 18 PIXEL NOBORDER XP TOOLTIP "Mostrar registros da página anterior"
   @242, 290 SBUTTON oSbPg3 PROMPT " " OF oCadDlg ACTION GetVndList(4,"+","",oXbVnd,oCadDlg,.f.,"New") FILENAME ".\figuras\skip.bmp"   SIZE 18, 18 PIXEL NOBORDER XP TOOLTIP "Mostrar registros da página seguinte"
   @242, 310 SBUTTON oSbPg4 PROMPT " " OF oCadDlg ACTION GetVndList(4,">","",oXbVnd,oCadDlg,.f.,"New") FILENAME ".\figuras\pgdn.bmp"   SIZE 18, 18 PIXEL NOBORDER XP TOOLTIP "Mostrar registros da última página"
   @248, 270 SAY oXbPag PROMPT ALLTRIM(STR(cVndQpg))+"/"+ALLTRIM(STR( INT(cVndQrc/50)+IIF(MOD(cVndQrc,50) > 0,1,0) )) OF oCadDlg SIZE 18,10 PIXEL UPDATE CENTER

   @242, (8+(nCol*7)-55) SBUTTON oSbt5 PROMPT "Retornar" OF oCadDlg ACTION oCadDlg:End() FILENAME ".\FIGURAS\btnsair.BMP" SIZE 50, 18 PIXEL NOBORDER XP TOOLTIP "Retornar para a tela principal"

   oCadDlg:SetFont(oDFont)
   ACTIVATE DIALOG oCadDlg ;
         ON INIT (oGrp:Hide(), oCadDlg:MISetSize(.F.), oCadDlg:Move(0, 0), VndLbxRsiz(oXbVnd, oXbItn, oGrp, oGrp02),;
                  cCPesq:= "*", GetVndList(1,@cCPesq,"",oXbVnd,oCadDlg,.f.,"New"), oXbVnd:Refresh(), xFocus(oGetPsq))

   RELEASE FONT oDFont, oFBold, oXBfon
RETURN NIL

STATIC FUNCTION VndLbxRsiz(oXbVnd, oXbItn, oGrp, oGrp02)
   oGrp:Show() ; WndSetSize(oXbVnd:hWnd, oGrp:nWidth, oGrp:nHeight, .t.) ; oGrp:Hide()
   nFactor := (oXbVnd:nWidth - aVndSavWd)
   nPorcen := 100 - ((100 / nFactor) * (aVndSavWd + (if( oXbVnd:lRecordSelector,80,0) + if( oXbVnd:lVScroll,50,0))))
   AEVAL( oXbVnd:aCols, {|o, nI| o:nWidth := aVndColWd[ nI ] + ((aVndColWd[ nI ] / 100) * nPorcen)} )
   oXbVnd:Refresh()
   
   oGrp02:Show() ; WndSetSize(oXbItn:hWnd, oGrp02:nWidth, oGrp02:nHeight, .t.) ; oGrp02:Hide()
   nFactor := (oXbItn:nWidth - aNfSavW2)
   nPorcen := 100 - ((100 / nFactor) * (aNfSavW2 + (if( oXbItn:lRecordSelector,80,0) + if( oXbItn:lVScroll,50,0))))
   AEVAL( oXbItn:aCols, {|o, nI| o:nWidth := aNfColWd2[ nI ] + ((aNfColWd2[ nI ] / 100) * nPorcen)} )
   oXbItn:Refresh()
RETURN NIL

STATIC FUNCTION EditVnd(lIsNew, oXbVnd)
   LOCAL lVndOk := .F., nAt :=  oXbVnd:nArrayAt
   if ! lIsNew
      IF LEN(aVndInf) = 0
      	SysRefresh() ; MsgAlert("Favor selecionar um registro válido","Aviso")
      	RETURN NIL
      ENDIF
      IF aVndInf[nAt,1] = 0
      	SysRefresh() ; MsgAlert("Favor selecionar um registro válido","Aviso")
      	RETURN NIL
   	endif
   ENDIF

   xItn01 := 0 // Código
   xItn02 := SPACE(15) // ID Unico
   xItn03 := SPACE(10) // Ref. Orçamento
   xItn04 := 0 // Ref. NF-e
   xItn05 := 0 // Ref. NFC-e
   xItn06 := SPACE(6) // Ref. SAT
   xItn07 := CTOD(" ") // Data venda
   xItn08 := SPACE(5) // Hora venda
   xItn09 := CTOD(" ") // Data entrega
   xItn10 := SPACE(5) // Hora entrega
   xItn11 := .F. // Cencelada?
   xItn12 := SPACE(10) // Dt. cancelamento
   xItn13 := SPACE(95) // Motivo cancelamento
   xItn14 := 0.00 // CFOP 1º item
   xItn15 := 0 // Cód. cliente
   xItn16 := SPACE(50) // Nome cliente
   xItn17 := SPACE(50) // Fantasia
   xItn18 := SPACE(10) // End. CEP
   xItn19 := SPACE(50) // End. Rua
   xItn20 := SPACE(15) // End. número
   xItn21 := SPACE(30) // End. bairro
   xItn22 := SPACE(30) // End. cidade
   xItn23 := SPACE(255) // Perímetro
   xItn24 := SPACE(50) // Telefone
   xItn25 := SPACE(20) // CPF/CNPJ
   xItn26 := SPACE(20) // RG/IE
   xItn27 := CTOD(" ") // Dt.Nascimento
   xItn28 := SPACE(50) // Autorizado
   xItn29 := SPACE(15) // Operação
   xItn30 := 0.000 // Vlr. Itens
   xItn31 := 0.00 // Desconto itens
   xItn32 := 0.000 // Desconto final
   xItn33 := 0.00 // Acréscimo %
   xItn34 := 0.00 // Mão de obra R$
   xItn35 := 0.00 // Couvert R$
   xItn36 := 0 // Qt. pessoas
   xItn37 := SPACE(11) // Valor pago
   xItn38 := 0.000 // Meio Pg 01
   xItn39 := 0.000 // Meio Pg 02
   xItn40 := 0.000 // Meio Pg 03
   xItn41 := 0.000 // Meio Pg 04
   xItn42 := 0.000 // Meio Pg 05
   xItn43 := 0.000 // Meio Pg 06
   xItn44 := 0.000 // Meio Pg 07
   xItn45 := 0.000 // Meio Pg 08
   xItn46 := 0.000 // Meio Pg 09
   xItn47 := 0.000 // Meio Pg 10
   xItn48 := 0.00 // Meio Pg 11
   xItn49 := SPACE(80) // Inf. Pg. Cartão
   xItn50 := SPACE(43) // Operador
   xItn51 := 0 // Cód. vendedor
   xItn52 := SPACE(30) // Nome vendedor
   xItn53 := 0 // Cód. Vd. Rateio
   xItn54 := SPACE(40) // Nome Vd. Rateio
   xItn55 := 0.00 // Valor Rateio
   xItn56 := SPACE(255) // Veículo - Inf.
   xItn57 := SPACE(30) // Veículo - KM
   xItn58 := SPACE(20) // Veículo - Modelo
   xItn59 := SPACE(8) // Veículo - Placa
   xItn60 := .F. // Venda futura?
   xItn61 := SPACE(30) // Observações

   n_Conn := nConection(.F., .F.)
   IF n_Conn <= 0 ; RETURN NIL ; ENDIF

   IF ! lIsNew
      xItn01 := aVndInf[nAt,01] // Código
      xItn02 := aVndInf[nAt,02] // ID Unico
      xItn03 := aVndInf[nAt,03] // Ref. Orçamento
      xItn04 := aVndInf[nAt,04] // Ref. NF-e
      xItn05 := aVndInf[nAt,05] // Ref. NFC-e
      xItn06 := aVndInf[nAt,06] // Ref. SAT
      xItn07 := FBToDate(aVndInf[nAt,07]) // Data venda
      xItn08 := aVndInf[nAt,08] // Hora venda
      xItn09 := FBToDate(aVndInf[nAt,09]) // Data entrega
      xItn10 := aVndInf[nAt,10] // Hora entrega
      xItn11 := aVndInf[nAt,11] // Cencelada?
      xItn12 := aVndInf[nAt,12] // Dt. cancelamento
      xItn13 := aVndInf[nAt,13] // Motivo cancelamento
      xItn14 := aVndInf[nAt,14] // CFOP 1º item
      xItn15 := aVndInf[nAt,15] // Cód. cliente
      xItn16 := aVndInf[nAt,16] // Nome cliente
      xItn17 := aVndInf[nAt,17] // Fantasia
      xItn18 := aVndInf[nAt,18] // End. CEP
      xItn19 := aVndInf[nAt,19] // End. Rua
      xItn20 := aVndInf[nAt,20] // End. número
      xItn21 := aVndInf[nAt,21] // End. bairro
      xItn22 := aVndInf[nAt,22] // End. cidade
      xItn23 := aVndInf[nAt,23] // Perímetro
      xItn24 := aVndInf[nAt,24] // Telefone
      xItn25 := aVndInf[nAt,25] // CPF/CNPJ
      xItn26 := aVndInf[nAt,26] // RG/IE
      xItn27 := FBToDate(aVndInf[nAt,27]) // Dt.Nascimento
      xItn28 := aVndInf[nAt,28] // Autorizado
      xItn29 := aVndInf[nAt,29] // Operação
      xItn30 := aVndInf[nAt,30] // Vlr. Itens
      xItn31 := aVndInf[nAt,31] // Desconto itens
      xItn32 := aVndInf[nAt,32] // Desconto final
      xItn33 := aVndInf[nAt,33] // Acréscimo %
      xItn34 := aVndInf[nAt,34] // Mão de obra R$
      xItn35 := aVndInf[nAt,35] // Couvert R$
      xItn36 := aVndInf[nAt,36] // Qt. pessoas
      xItn37 := aVndInf[nAt,37] // Valor pago
      xItn38 := aVndInf[nAt,38] // Meio Pg 01
      xItn39 := aVndInf[nAt,39] // Meio Pg 02
      xItn40 := aVndInf[nAt,40] // Meio Pg 03
      xItn41 := aVndInf[nAt,41] // Meio Pg 04
      xItn42 := aVndInf[nAt,42] // Meio Pg 05
      xItn43 := aVndInf[nAt,43] // Meio Pg 06
      xItn44 := aVndInf[nAt,44] // Meio Pg 07
      xItn45 := aVndInf[nAt,45] // Meio Pg 08
      xItn46 := aVndInf[nAt,46] // Meio Pg 09
      xItn47 := aVndInf[nAt,47] // Meio Pg 10
      xItn48 := aVndInf[nAt,48] // Meio Pg 11
      xItn49 := aVndInf[nAt,49] // Inf. Pg. Cartão
      xItn50 := aVndInf[nAt,50] // Operador
      xItn51 := aVndInf[nAt,51] // Cód. vendedor
      xItn52 := aVndInf[nAt,52] // Nome vendedor
      xItn53 := aVndInf[nAt,53] // Cód. Vd. Rateio
      xItn54 := aVndInf[nAt,54] // Nome Vd. Rateio
      xItn55 := aVndInf[nAt,55] // Valor Rateio
      xItn56 := aVndInf[nAt,56] // Veículo - Inf.
      xItn57 := aVndInf[nAt,57] // Veículo - KM
      xItn58 := aVndInf[nAt,58] // Veículo - Modelo
      xItn59 := aVndInf[nAt,59] // Veículo - Placa
      xItn60 := aVndInf[nAt,60] // Venda futura?
      xItn61 := aVndInf[nAt,61] // Observações
   ENDIF

   n_Color := nRGB(192,217,217)
   DEFINE BRUSH oDlBru COLOR n_Color
   DEFINE FONT oDlFnt NAME "Arial Narrow" SIZE 0, -15
   SysRefresh()
   DEFINE DIALOG oCadVnd RESOURCE "CAD_VENDA" TITLE "Consulta de venda online" TRANSPARENT BRUSH oDlBru
   oCadVnd:SetFont(oDlFnt)
   REDEFINE GET oCt03 VAR xItn03 ID 101 OF oCadVnd
   REDEFINE GET oCt04 VAR xItn04 PICTURE "9999999999" ID 102 OF oCadVnd
   REDEFINE GET oCt05 VAR xItn05 PICTURE "9999999999" ID 103 OF oCadVnd
   REDEFINE GET oCt06 VAR xItn06 ID 104 OF oCadVnd
   REDEFINE GET oCt07 VAR xItn07 ID 105 OF oCadVnd
   REDEFINE GET oCt08 VAR xItn08 ID 106 OF oCadVnd
   REDEFINE GET oCt09 VAR xItn09 ID 107 OF oCadVnd
   REDEFINE GET oCt10 VAR xItn10 ID 108 OF oCadVnd
   REDEFINE GET oCt11 VAR xItn11 ID 109 OF oCadVnd
   REDEFINE GET oCt12 VAR xItn12 ID 110 OF oCadVnd
   REDEFINE GET oCt13 VAR xItn13 ID 111 OF oCadVnd
   REDEFINE GET oCt14 VAR xItn14 PICTURE "@E 99999999.99" ID 112 OF oCadVnd
   REDEFINE GET oCt15 VAR xItn15 PICTURE "9999999999" ID 113 OF oCadVnd
   REDEFINE GET oCt16 VAR xItn16 ID 114 OF oCadVnd
   REDEFINE GET oCt17 VAR xItn17 ID 115 OF oCadVnd
   REDEFINE GET oCt18 VAR xItn18 ID 116 OF oCadVnd
   REDEFINE GET oCt19 VAR xItn19 ID 117 OF oCadVnd
   REDEFINE GET oCt20 VAR xItn20 ID 118 OF oCadVnd
   REDEFINE GET oCt21 VAR xItn21 ID 119 OF oCadVnd
   REDEFINE GET oCt22 VAR xItn22 ID 120 OF oCadVnd
   REDEFINE GET oCt23 VAR xItn23 ID 121 OF oCadVnd
   REDEFINE GET oCt24 VAR xItn24 ID 122 OF oCadVnd
   REDEFINE GET oCt25 VAR xItn25 ID 123 OF oCadVnd
   REDEFINE GET oCt26 VAR xItn26 ID 124 OF oCadVnd
   REDEFINE GET oCt27 VAR xItn27 ID 125 OF oCadVnd
   REDEFINE GET oCt28 VAR xItn28 ID 126 OF oCadVnd
   REDEFINE GET oCt29 VAR xItn29 ID 127 OF oCadVnd
   REDEFINE GET oCt30 VAR xItn30 PICTURE "@E 9999999999999.999" ID 128 OF oCadVnd
   REDEFINE GET oCt31 VAR xItn31 PICTURE "@E 99999999.99" ID 129 OF oCadVnd
   REDEFINE GET oCt32 VAR xItn32 PICTURE "@E 99999999.999" ID 130 OF oCadVnd
   REDEFINE GET oCt33 VAR xItn33 PICTURE "@E 9999.99" ID 131 OF oCadVnd
   REDEFINE GET oCt34 VAR xItn34 PICTURE "@E 99999999.99" ID 132 OF oCadVnd
   REDEFINE GET oCt35 VAR xItn35 PICTURE "@E 99999999.99" ID 133 OF oCadVnd
   REDEFINE GET oCt36 VAR xItn36 PICTURE "999" ID 134 OF oCadVnd
   REDEFINE GET oCt37 VAR xItn37 ID 135 OF oCadVnd
   REDEFINE GET oCt38 VAR xItn38 PICTURE "@E 99999999.999" ID 136 OF oCadVnd
   REDEFINE GET oCt39 VAR xItn39 PICTURE "@E 99999999.999" ID 137 OF oCadVnd
   REDEFINE GET oCt40 VAR xItn40 PICTURE "@E 99999999.999" ID 138 OF oCadVnd
   REDEFINE GET oCt41 VAR xItn41 PICTURE "@E 99999999.999" ID 139 OF oCadVnd
   REDEFINE GET oCt42 VAR xItn42 PICTURE "@E 99999999.999" ID 140 OF oCadVnd
   REDEFINE GET oCt43 VAR xItn43 PICTURE "@E 99999999.999" ID 141 OF oCadVnd
   REDEFINE GET oCt44 VAR xItn44 PICTURE "@E 99999999.999" ID 142 OF oCadVnd
   REDEFINE GET oCt45 VAR xItn45 PICTURE "@E 99999999.999" ID 143 OF oCadVnd
   REDEFINE GET oCt46 VAR xItn46 PICTURE "@E 99999999.999" ID 144 OF oCadVnd
   REDEFINE GET oCt47 VAR xItn47 PICTURE "@E 99999999.999" ID 145 OF oCadVnd
   REDEFINE GET oCt48 VAR xItn48 PICTURE "@E 99999999.99" ID 146 OF oCadVnd
   REDEFINE GET oCt49 VAR xItn49 ID 147 OF oCadVnd
   REDEFINE GET oCt50 VAR xItn50 ID 148 OF oCadVnd
   REDEFINE GET oCt51 VAR xItn51 PICTURE "999" ID 149 OF oCadVnd
   REDEFINE GET oCt52 VAR xItn52 ID 150 OF oCadVnd
   REDEFINE GET oCt53 VAR xItn53 PICTURE "999" ID 151 OF oCadVnd
   REDEFINE GET oCt54 VAR xItn54 ID 152 OF oCadVnd
   REDEFINE GET oCt55 VAR xItn55 PICTURE "@E 99999999.99" ID 153 OF oCadVnd
   REDEFINE GET oCt56 VAR xItn56 ID 154 OF oCadVnd
   REDEFINE GET oCt57 VAR xItn57 ID 155 OF oCadVnd
   REDEFINE GET oCt58 VAR xItn58 ID 156 OF oCadVnd
   REDEFINE GET oCt59 VAR xItn59 ID 157 OF oCadVnd
   REDEFINE GET oCt60 VAR xItn60 ID 158 OF oCadVnd
   REDEFINE GET oCt61 VAR xItn61 ID 159 OF oCadVnd
   REDEFINE SBUTTON oBt1 PROMPT "Salvar"                          ID 201 OF oCadVnd RESOURCE "BTYESOK"                       NOBORDER XP ACTION (lVndOk := .T., oCadVnd:End())
   REDEFINE SBUTTON oBt2 PROMPT IIF(lIsNew,"Cancelar","Retornar") ID 202 OF oCadVnd RESOURCE IIF(lIsNew,"BTN_CAN","BTN_SAI") NOBORDER XP ACTION (lVndOk := .F., oCadVnd:End())
   ACTIVATE DIALOG oCadVnd CENTERED
   DeleteObject(oDlFnt)
   DeleteObject(oDlBru)

   IF ! lVndOk ; RETURN NIL ; ENDIF

   IF lIsNew
      n_Conn := nConection(.F., .F.)
      IF n_Conn <= 0 ; RETURN NIL ; ENDIF
      xItn02 := GeraIdUnico()
      cQury := "INSERT INTO vendas_info "+;
               "(codigo, idunic, orcnum, nfenum, nfcnum, satnum, dtoper, horaop, dtentr, hoentr, opcanc, dtcanc, cancpq, cfoini, codcli, nomcli, fancli, ruacep, ruacli, ruanro, bairro, cidade, ruaper, fone01, doccpf, doc_rg, nascli, cliaut, operac, titens, descit, descfi, acresc, acres1, acres2, qtpess, vrpago, pgto01, pgto02, pgto03, pgto04, pgto05, pgto06, pgto07, pgto08, pgto09, pgto10, pgto11, cartao, operad, vddcod, vddnom, nvdrat, cvdrat, vlrrat, carinf, car_km, carmod, carpla, futura, observ)"+;
               " VALUES ("+;
                 "(SELECT coalesce(MAX(codigo), 0)+1 AS ULTCOD FROM vendas_info), "+;
                 "'"+xItn02+"', "+;
                 "'"+ALLTRIM(xItn03)+"', "+;
                 ALLTRIM(STR(xItn04))+", "+;
                 ALLTRIM(STR(xItn05))+", "+;
                 "'"+ALLTRIM(xItn06)+"', "+;
                 "'"+SQLDTOC(xItn07)+"', "+;
                 "'"+ALLTRIM(xItn08)+"', "+;
                 "'"+SQLDTOC(xItn09)+"', "+;
                 "'"+ALLTRIM(xItn10)+"', "+;
                 IIF(!xItn11,"0","1")+", "+;
                 "'"+ALLTRIM(xItn12)+"', "+;
                 "'"+ALLTRIM(xItn13)+"', "+;
                 ALLTRIM(STR(xItn14))+", "+;
                 ALLTRIM(STR(xItn15))+", "+;
                 "'"+ALLTRIM(xItn16)+"', "+;
                 "'"+ALLTRIM(xItn17)+"', "+;
                 "'"+ALLTRIM(xItn18)+"', "+;
                 "'"+ALLTRIM(xItn19)+"', "+;
                 "'"+ALLTRIM(xItn20)+"', "+;
                 "'"+ALLTRIM(xItn21)+"', "+;
                 "'"+ALLTRIM(xItn22)+"', "+;
                 "'"+ALLTRIM(xItn23)+"', "+;
                 "'"+ALLTRIM(xItn24)+"', "+;
                 "'"+ALLTRIM(xItn25)+"', "+;
                 "'"+ALLTRIM(xItn26)+"', "+;
                 "'"+SQLDTOC(xItn27)+"', "+;
                 "'"+ALLTRIM(xItn28)+"', "+;
                 "'"+ALLTRIM(xItn29)+"', "+;
                 ALLTRIM(STR(xItn30))+", "+;
                 ALLTRIM(STR(xItn31))+", "+;
                 ALLTRIM(STR(xItn32))+", "+;
                 ALLTRIM(STR(xItn33))+", "+;
                 ALLTRIM(STR(xItn34))+", "+;
                 ALLTRIM(STR(xItn35))+", "+;
                 ALLTRIM(STR(xItn36))+", "+;
                 "'"+ALLTRIM(xItn37)+"', "+;
                 ALLTRIM(STR(xItn38))+", "+;
                 ALLTRIM(STR(xItn39))+", "+;
                 ALLTRIM(STR(xItn40))+", "+;
                 ALLTRIM(STR(xItn41))+", "+;
                 ALLTRIM(STR(xItn42))+", "+;
                 ALLTRIM(STR(xItn43))+", "+;
                 ALLTRIM(STR(xItn44))+", "+;
                 ALLTRIM(STR(xItn45))+", "+;
                 ALLTRIM(STR(xItn46))+", "+;
                 ALLTRIM(STR(xItn47))+", "+;
                 ALLTRIM(STR(xItn48))+", "+;
                 "'"+ALLTRIM(xItn49)+"', "+;
                 "'"+ALLTRIM(xItn50)+"', "+;
                 ALLTRIM(STR(xItn51))+", "+;
                 "'"+ALLTRIM(xItn52)+"', "+;
                 ALLTRIM(STR(xItn53))+", "+;
                 "'"+ALLTRIM(xItn54)+"', "+;
                 ALLTRIM(STR(xItn55))+", "+;
                 "'"+ALLTRIM(xItn56)+"', "+;
                 "'"+ALLTRIM(xItn57)+"', "+;
                 "'"+ALLTRIM(xItn58)+"', "+;
                 "'"+ALLTRIM(xItn59)+"', "+;
                 IIF(!xItn60,"0","1")+", "+;
                 "'"+ALLTRIM(xItn61)+"'"+")"
      TRY
         oSql := SR_GetConnection()
         nErr := oSql:Execute(cQury)
         oSql:Commit()
         cSeek := xItn02 // Usar ID Unico
         GetVndList(3,@cSeek,"",oXbVnd,oCadDlg,.F.,"Add")
      CATCH oErr
         SysRefresh(); MsgAlert("Erro ao tentar salvar os dados."+CRLF+CRLF+"Erro: "+oErr:Description,"Erro")
      END
   ELSE
      cQury := "UPDATE vendas_info SET"+;
               " idunic = '"+ALLTRIM(xItn02)+"',"+;
               " orcnum = '"+ALLTRIM(xItn03)+"',"+;
               " nfenum = "+ALLTRIM(STR(xItn04))+","+;
               " nfcnum = "+ALLTRIM(STR(xItn05))+","+;
               " satnum = '"+ALLTRIM(xItn06)+"',"+;
               " dtoper = '"+SQLDTOC(xItn07)+"',"+;
               " horaop = '"+ALLTRIM(xItn08)+"',"+;
               " dtentr = '"+SQLDTOC(xItn09)+"',"+;
               " hoentr = '"+ALLTRIM(xItn10)+"',"+;
               " opcanc = "+IIF(!xItn11,"0","1")+","+;
               " dtcanc = '"+ALLTRIM(xItn12)+"',"+;
               " cancpq = '"+ALLTRIM(xItn13)+"',"+;
               " cfoini = "+ALLTRIM(STR(xItn14))+","+;
               " codcli = "+ALLTRIM(STR(xItn15))+","+;
               " nomcli = '"+ALLTRIM(xItn16)+"',"+;
               " fancli = '"+ALLTRIM(xItn17)+"',"+;
               " ruacep = '"+ALLTRIM(xItn18)+"',"+;
               " ruacli = '"+ALLTRIM(xItn19)+"',"+;
               " ruanro = '"+ALLTRIM(xItn20)+"',"+;
               " bairro = '"+ALLTRIM(xItn21)+"',"+;
               " cidade = '"+ALLTRIM(xItn22)+"',"+;
               " ruaper = '"+ALLTRIM(xItn23)+"',"+;
               " fone01 = '"+ALLTRIM(xItn24)+"',"+;
               " doccpf = '"+ALLTRIM(xItn25)+"',"+;
               " doc_rg = '"+ALLTRIM(xItn26)+"',"+;
               " nascli = '"+SQLDTOC(xItn27)+"',"+;
               " cliaut = '"+ALLTRIM(xItn28)+"',"+;
               " operac = '"+ALLTRIM(xItn29)+"',"+;
               " titens = "+ALLTRIM(STR(xItn30))+","+;
               " descit = "+ALLTRIM(STR(xItn31))+","+;
               " descfi = "+ALLTRIM(STR(xItn32))+","+;
               " acresc = "+ALLTRIM(STR(xItn33))+","+;
               " acres1 = "+ALLTRIM(STR(xItn34))+","+;
               " acres2 = "+ALLTRIM(STR(xItn35))+","+;
               " qtpess = "+ALLTRIM(STR(xItn36))+","+;
               " vrpago = '"+ALLTRIM(xItn37)+"',"+;
               " pgto01 = "+ALLTRIM(STR(xItn38))+","+;
               " pgto02 = "+ALLTRIM(STR(xItn39))+","+;
               " pgto03 = "+ALLTRIM(STR(xItn40))+","+;
               " pgto04 = "+ALLTRIM(STR(xItn41))+","+;
               " pgto05 = "+ALLTRIM(STR(xItn42))+","+;
               " pgto06 = "+ALLTRIM(STR(xItn43))+","+;
               " pgto07 = "+ALLTRIM(STR(xItn44))+","+;
               " pgto08 = "+ALLTRIM(STR(xItn45))+","+;
               " pgto09 = "+ALLTRIM(STR(xItn46))+","+;
               " pgto10 = "+ALLTRIM(STR(xItn47))+","+;
               " pgto11 = "+ALLTRIM(STR(xItn48))+","+;
               " cartao = '"+ALLTRIM(xItn49)+"',"+;
               " operad = '"+ALLTRIM(xItn50)+"',"+;
               " vddcod = "+ALLTRIM(STR(xItn51))+","+;
               " vddnom = '"+ALLTRIM(xItn52)+"',"+;
               " nvdrat = "+ALLTRIM(STR(xItn53))+","+;
               " cvdrat = '"+ALLTRIM(xItn54)+"',"+;
               " vlrrat = "+ALLTRIM(STR(xItn55))+","+;
               " carinf = '"+ALLTRIM(xItn56)+"',"+;
               " car_km = '"+ALLTRIM(xItn57)+"',"+;
               " carmod = '"+ALLTRIM(xItn58)+"',"+;
               " carpla = '"+ALLTRIM(xItn59)+"',"+;
               " futura = "+IIF(!xItn60,"0","1")+","+;
               " observ = '"+ALLTRIM(xItn61)+"'"+;
               " WHERE codigo = "+ALLTRIM(STR(xItn01))
      TRY
         n_Conn := nConection(.F., .F.)
         IF n_Conn <= 0 ; BREAK ; ENDIF
         oSql := SR_GetConnection()
         nErr := oSql:Execute(cQury)
         oSql:Commit()
         cSeek := xItn02 // Usar ID Unico
         GetVndList(3,@cSeek,"",oXbVnd,oCadDlg,.F.,"Upd")
      CATCH oErr
         SysRefresh() ; MsgAlert("Erro ao tentar salvar os dados."+CRLF+CRLF+"Erro: "+oErr:Description,"Erro")
      END
   ENDIF
RETURN lVndOk

STATIC FUNCTION DeleVnd(oXbVnd)
   LOCAL lSave := .F., nAt := oXbVnd:nArrayAt
   IF LEN(aVndInf) = 0
   	SysRefresh() ; MsgAlert("Favor selecionar um registro válido","Aviso")
   	RETURN NIL
   ENDIF
   IF aVndInf[nAt,1] = 0
   	SysRefresh() ; MsgAlert("Favor selecionar um registro válido","Aviso")
   	RETURN NIL
   ENDIF
   IF ! MsgNoYes("Confirma a exclusão do registro selecionado?", "Favor confirmar a exclusção!")
   	RETURN NIL
   ENDIF
   TRY
      n_Conn := nConection(.F., .F.)
      IF n_Conn <= 0 ; BREAK ; ENDIF
      oSql := SR_GetConnection()
      nErr := oSql:Execute("DELETE FROM vendas_info WHERE codigo = "+ALLTRIM(STR(aVndInf[nAt,01])))
      oSql:Commit()
      MyADel(aVndInf, nAt)
      oXbVnd:SetArray(aVndInf)
      oXbVnd:nArrayAt := nAt - 1 ; oXbVnd:Refresh()
      SysRefresh() ; MsgInfo("Registro excluído com êxito.", "Informação")
   CATCH oErr
      SysRefresh() ; MsgAlert("Erro ao tentar salvar os dados."+CRLF+CRLF+"Erro: "+oErr:Description,"Erro")
   END
RETURN NIL

STATIC FUNCTION GetVndList(nQue,cPesq,cUniq,oBrw,oCadDlg,lAvisa,cAcao)
   LOCAL aRcrds := {}, nRAt := 0
   IF oBrw <> NIL ; nRAt := oBrw:nArrayAt ; ENDIF
   IF EMPTY(cPesq) ; RETURN .T. ; ENDIF

   n_Conn := nConection(.F., .F.)
   IF n_Conn <= 0 ; RETURN .F. ; ENDIF

   cQryTt := ""
   cWhere := ""
   cOrder := ""

   IF nQue < 4
      cVndQry := "SELECT"+;
                   " codigo,"+; // 01-Código
                   " idunic,"+; // 02-ID Unico
                   " orcnum,"+; // 03-Ref. Orçamento
                   " nfenum,"+; // 04-Ref. NF-e
                   " nfcnum,"+; // 05-Ref. NFC-e
                   " satnum,"+; // 06-Ref. SAT
                   " dtoper,"+; // 07-Data venda
                   " horaop,"+; // 08-Hora venda
                   " dtentr,"+; // 09-Data entrega
                   " hoentr,"+; // 10-Hora entrega
                   " opcanc,"+; // 11-Cencelada?
                   " dtcanc,"+; // 12-Dt. cancelamento
                   " cancpq,"+; // 13-Motivo cancelamento
                   " cfoini,"+; // 14-CFOP 1º item
                   " codcli,"+; // 15-Cód. cliente
                   " nomcli,"+; // 16-Nome cliente
                   " fancli,"+; // 17-Fantasia
                   " ruacep,"+; // 18-End. CEP
                   " ruacli,"+; // 19-End. Rua
                   " ruanro,"+; // 20-End. número
                   " bairro,"+; // 21-End. bairro
                   " cidade,"+; // 22-End. cidade
                   " ruaper,"+; // 23-Perímetro
                   " fone01,"+; // 24-Telefone
                   " doccpf,"+; // 25-CPF/CNPJ
                   " doc_rg,"+; // 26-RG/IE
                   " nascli,"+; // 27-Dt.Nascimento
                   " cliaut,"+; // 28-Autorizado
                   " operac,"+; // 29-Operação
                   " titens,"+; // 30-Vlr. Itens
                   " descit,"+; // 31-Desconto itens
                   " descfi,"+; // 32-Desconto final
                   " acresc,"+; // 33-Acréscimo %
                   " acres1,"+; // 34-Mão de obra R$
                   " acres2,"+; // 35-Couvert R$
                   " qtpess,"+; // 36-Qt. pessoas
                   " vrpago,"+; // 37-Valor pago
                   " pgto01,"+; // 38-Meio Pg 01
                   " pgto02,"+; // 39-Meio Pg 02
                   " pgto03,"+; // 40-Meio Pg 03
                   " pgto04,"+; // 41-Meio Pg 04
                   " pgto05,"+; // 42-Meio Pg 05
                   " pgto06,"+; // 43-Meio Pg 06
                   " pgto07,"+; // 44-Meio Pg 07
                   " pgto08,"+; // 45-Meio Pg 08
                   " pgto09,"+; // 46-Meio Pg 09
                   " pgto10,"+; // 47-Meio Pg 10
                   " pgto11,"+; // 48-Meio Pg 11
                   " cartao,"+; // 49-Inf. Pg. Cartão
                   " operad,"+; // 50-Operador
                   " vddcod,"+; // 51-Cód. vendedor
                   " vddnom,"+; // 52-Nome vendedor
                   " nvdrat,"+; // 53-Cód. Vd. Rateio
                   " cvdrat,"+; // 54-Nome Vd. Rateio
                   " vlrrat,"+; // 55-Valor Rateio
                   " carinf,"+; // 56-Veículo - Inf.
                   " car_km,"+; // 57-Veículo - KM
                   " carmod,"+; // 58-Veículo - Modelo
                   " carpla,"+; // 59-Veículo - Placa
                   " futura,"+; // 60-Venda futura?
                   " observ"+;  // 61-Observações
                   " FROM vendas_info"
      cWhere := ""
      cOrder := ""
   	IF nQue = 1
         IF ALLTRIM(cPesq) == "*"
            cWhere := " WHERE codigo > 0"
            cOrder := " ORDER BY nomcli"
         ELSE
            IF ALLTRIM(cQPesq) = "Código venda" // "Nome cliente", "Fantasia", "CPF/CNPJ", "Nome vendedor", "Data venda", "Data entrega", "Código venda", "Cód. cliente", "Cód. vendedor"
               cWhere := " WHERE codigo = "+ALLTRIM(cPesq)
               cOrder := " ORDER BY codigo"
            ENDIF
            IF ALLTRIM(cQPesq) = "Data venda"
               cWhere := " WHERE dtoper = '"+SR_dtosdot(CTOD(cPesq))+"'"
               cOrder := " ORDER BY dtoper"
            ENDIF
            IF ALLTRIM(cQPesq) = "Data entrega"
               cWhere := " WHERE dtentr = '"+SR_dtosdot(CTOD(cPesq))+"'"
               cOrder := " ORDER BY dtentr"
            ENDIF
            IF ALLTRIM(cQPesq) = "Cód. cliente"
               cWhere := " WHERE codcli = "+ALLTRIM(cPesq)
               cOrder := " ORDER BY codcli"
            ENDIF
            IF ALLTRIM(cQPesq) = "Nome cliente"
               cWhere := " WHERE nomcli LIKE '%"+UPPER(ALLTRIM(cPesq))+"%'"
               cOrder := " ORDER BY nomcli"
            ENDIF
            IF ALLTRIM(cQPesq) = "Fantasia"
               cWhere := " WHERE fancli LIKE '%"+UPPER(ALLTRIM(cPesq))+"%'"
               cOrder := " ORDER BY fancli"
            ENDIF
            IF ALLTRIM(cQPesq) = "CPF/CNPJ"
               cWhere := " WHERE doccpf = '"+UPPER(ALLTRIM(cPesq))+"'"
               cOrder := " ORDER BY doccpf"
            ENDIF
            IF ALLTRIM(cQPesq) = "Cód. vendedor"
               cWhere := " WHERE vddcod = "+ALLTRIM(cPesq)
               cOrder := " ORDER BY vddcod"
            ENDIF
            IF ALLTRIM(cQPesq) = "Nome vendedor"
               cWhere := " WHERE vddnom LIKE '%"+UPPER(ALLTRIM(cPesq))+"%'"
               cOrder := " ORDER BY vddnom"
            ENDIF
         ENDIF
      ELSEIF nQue = 2
         cWhere := " WHERE nomcli LIKE '"+ALLTRIM(cPesq)+"%'"
         cOrder := " ORDER BY nomcli"
      ELSEIF nQue = 3
         cWhere := " WHERE idunic = '"+ALLTRIM(cPesq)+"'"
         cOrder := ""
      ELSE
         cWhere := " WHERE codigo > 0"
         cOrder := " ORDER BY nomcli"
      ENDIF
      IF nQue > 0
         cLimit := " LIMIT "+ALLTRIM(STR(cVndSkp))+", 50"
      ELSE
         cLimit := " LIMIT 1" // Get only 1 record, to be cleaned.
      ENDIF
      cVndQry += cWhere + cOrder + cLimit
      cQryTt := "SELECT COUNT(*) FROM vendas_info" + cWhere
   ELSE
      IF cPesq = "+"
         IF (cVndSkp + 50) < cVndQrc
            cVndSkp += 50 ; cVndQpg ++
            cVndQry := STRTRAN(cVndQry, "LIMIT "+ALLTRIM(STR(cVndLsk)), "LIMIT "+ALLTRIM(STR(cVndSkp)))
            cVndLsk := cVndSkp
         ELSE
            RETURN .T.
         ENDIF
      ENDIF
      IF cPesq = "-"
         IF (cVndSkp - 50) > -1
            cVndSkp -= 50 ; cVndQpg --
            cVndQry := STRTRAN(cVndQry, "LIMIT "+ALLTRIM(STR(cVndLsk)), "LIMIT "+ALLTRIM(STR(cVndSkp)))
            cVndLsk := cVndSkp
         ELSE
            RETURN .T.
         ENDIF
      ENDIF
      IF cPesq = ">"
         IF (cVndSkp + 50) < cVndQrc
            cVndSkp := (INT(cVndQrc/50)*50) ; cVndQpg := INT(cVndQrc/50)+IIF(MOD(cVndQrc,50) > 0, 1, 0)
            cVndQry := STRTRAN(cVndQry, "LIMIT "+ALLTRIM(STR(cVndLsk)), "LIMIT "+ALLTRIM(STR(cVndSkp)))
            cVndLsk := cVndSkp
         ELSE
            RETURN .T.
         ENDIF
      ENDIF
      IF cPesq = "<"
         IF (cVndSkp - 50) > -1
            cVndSkp := 0 ; cVndQpg := 1
            cVndQry := STRTRAN(cVndQry, "LIMIT "+ALLTRIM(STR(cVndLsk)), "LIMIT "+ALLTRIM(STR(cVndSkp)))
            cVndLsk := cVndSkp
         ELSE
            RETURN .T.
         ENDIF
      ENDIF
   ENDIF

   l_Err := .F.
   aVndInf := {}
   IF ! EMPTY(cQryTt)
      aTtRec := SQLArray(cQryTt, @l_Err)
      IF LEN(aTtRec) > 0 ; cVndQpg := 1; cVndQrc := aTtRec[1,1] ; ENDIF
   ENDIF

   l_Err := .F.
   aRcrds := SQLArray(cVndQry, @l_Err)

   IF LEN(aRcrds) = 0
      IF oBrw <> NIL ; aVndInf := aVndNul ; oBrw:SetArray(aVndInf) ; oBrw:Refresh() ; ENDIF
      IF lAvisa ; SysRefresh() ; MsgAlert("Informação não encontrada", "Aviso") ; ENDIF
   ELSE
      if nQue = 0 // Pegar apenas registro em branco.
   	   aInfo := aRcrds[1]
   	   for nCl := 1 TO LEN(aInfo)
   			xInv := aInfo[nCl]
   			if ValType(xInv) = 'C' ; xInv := SPACE(LEN(xInv)) ; ENDIF
   			if ValType(xInv) = 'M' ; xInv := SPACE(10) ; ENDIF
   			if ValType(xInv) = 'N' ; xInv := 0 ; ENDIF
   			if ValType(xInv) = 'D' ; xInv := CTOD(" ") ; ENDIF
   			if ValType(xInv) = 'L' ; xInv := .F. ; ENDIF
   			aRcrds[1,nCl] := xInv
   		next
   		aVndNul := aRcrds
   	endif
      IF cAcao = "New"
         aVndInf := aRcrds
      ELSEIF cAcao = "Add"
         AADD(aVndInf, aRcrds[1])
      ELSEIF cAcao = "Upd"
         aVndInf[nRAt] := aRcrds[1]
      ENDIF
   ENDIF
   cPesq := SPACE(50)
   cUniq := SPACE(15)
   IF oBrw <> NIL
      IF cAcao = "Add" .OR. cAcao = "New"
         oBrw:SetArray(aVndInf)
         oBrw:GoTop()
      ELSEIF cAcao = "Upd"
         oBrw:nArrayAt := nRAt
      ENDIF
      oBrw:Refresh()
   ENDIF
   if oCadDlg <> nil ; oCadDlg:Update() ; endif
RETURN .F.

FUNCTION OrdGetItms(nPedId, cUnqId)
   LOCAL a_Itens := {}, a_Array := {}
   IF nPedId = 0
      AADD(a_Itens, {"", "", 0, 0.00, 0.00, 0.00, "", CTOD(" "), CTOD(" ")})
      RETURN a_Itens
   ENDIF
   cItnsQry := "SELECT"+;
                " idumov,"+; // 01-ID unico mov
                " codmov,"+; // 02-Cód. movimento
                " idloja,"+; // 03-ID da loja
                " codprd,"+; // 04-Cód. produto
                " descri,"+; // 05-Descrição
                " medlin,"+; // 06-Med. linear
                " medidx,"+; // 07-Medida X
                " medidy,"+; // 08-Medida Y
                " quanti,"+; // 09-Quantidade
                " prcomp,"+; // 10-Preço compra
                " vrunit,"+; // 11-Pr. s/ desconto
                " prdesc,"+; // 12-Pr. c/ desconto
                " vrbrut,"+; // 13-Pr. Total
                " lotenr,"+; // 14-Nr. do lote
                " fabric,"+; // 15-Dt. fabricação
                " valida,"+; // 16-Dt. validade
                " tabpre"+;  // 17-Tabela preço
                " FROM vendas_itens WHERE codmov = "+ALLTRIM(str(nPedId))+" AND idumov = '"+cUnqId+"'"
   l_Err := .F.
   a_Array := SQLArray(cItnsQry, @l_Err)
   IF LEN(a_Array) = 0
      AADD(a_Itens, {"", "", 0, 0.00, 0.00, 0.00, "", CTOD(" "), CTOD(" ")})
   ELSE
      FOR nItn := 1 TO LEN(a_Array)
         AADD(a_Itens, {a_Array[nItn,04],; // 01-Código do produto
                        a_Array[nItn,05],; // 02-Descrição
                        a_Array[nItn,09],; // 03-Quantidade
                        a_Array[nItn,11],; // 04-Preço sem desconto
                        a_Array[nItn,12],; // 05-Preço com desconto
                        a_Array[nItn,13],; // 06-Valor total do item
                        a_Array[nItn,14],; // 07-Nr. do lote
                        a_Array[nItn,15],; // 08-Data de fabricação
                        a_Array[nItn,16]}) // 09-Data de validade
      NEXT
   ENDIF
RETURN a_Itens

STATIC FUNCTION ImprVnd(oXbVnd)
   LOCAL lConf:=.F., l_Err := .F., aVdInfo := {}
   
   n_Conn := nConection(.F., .F.)
   IF n_Conn <= 0 ; RETURN .F. ; ENDIF

   aLojas := {}
   SqlArr := "SELECT "+;
                "NICK01, "+; // 01-Nome da Loja 1
                "NICK02, "+; // 02-Nome da Loja 2
                "NICK03, "+; // 03-Nome da Loja 3
                "NICK04, "+; // 04-Nome da Loja 4
                "NICK05, "+; // 05-Nome da Loja 5
                "NICK06, "+; // 06-Nome da Loja 6
                "NICK07, "+; // 07-Nome da Loja 7
                "NICK08, "+; // 08-Nome da Loja 8
                "NICK09, "+; // 09-Nome da Loja 9
                "NICK10, "+; // 10-Nome da Loja 10
                "USAR01, "+; // 11-Usar a Loja 1 no relatório
                "USAR02, "+; // 12-Usar a Loja 2 no relatório
                "USAR03, "+; // 13-Usar a Loja 3 no relatório
                "USAR04, "+; // 14-Usar a Loja 4 no relatório
                "USAR05, "+; // 15-Usar a Loja 5 no relatório
                "USAR06, "+; // 16-Usar a Loja 6 no relatório
                "USAR07, "+; // 17-Usar a Loja 7 no relatório
                "USAR08, "+; // 18-Usar a Loja 8 no relatório
                "USAR09, "+; // 19-Usar a Loja 9 no relatório
                "USAR10 "+;  // 20-Usar a Loja 10 no relatório
                   "FROM config_bd LIMIT 0, 1"
   aLojas := SQLArray(SqlArr)

   aTrnTo := {{0,""}}
   IF LEN(aLojas) > 0
      IF aLojas[1,11] ; AADD(aTrnTo, {01, aLojas[1,01]}) ; ENDIF
      IF aLojas[1,12] ; AADD(aTrnTo, {02, aLojas[1,02]}) ; ENDIF
      IF aLojas[1,13] ; AADD(aTrnTo, {03, aLojas[1,03]}) ; ENDIF
      IF aLojas[1,14] ; AADD(aTrnTo, {04, aLojas[1,04]}) ; ENDIF
      IF aLojas[1,15] ; AADD(aTrnTo, {05, aLojas[1,05]}) ; ENDIF
      IF aLojas[1,16] ; AADD(aTrnTo, {06, aLojas[1,06]}) ; ENDIF
      IF aLojas[1,17] ; AADD(aTrnTo, {07, aLojas[1,07]}) ; ENDIF
      IF aLojas[1,18] ; AADD(aTrnTo, {08, aLojas[1,08]}) ; ENDIF
      IF aLojas[1,19] ; AADD(aTrnTo, {09, aLojas[1,09]}) ; ENDIF
      IF aLojas[1,20] ; AADD(aTrnTo, {10, aLojas[1,10]}) ; ENDIF
   ENDIF

   dIni := CTOD("01"+SUBSTR(DTOC(DATE()),3,8))
   dFim := DATE()
   nCli := SPACE(14)
   cCli := ""
   nVdd := SPACE(3)
   cVdd := ""
   cLoja := ""

   DEFINE DIALOG oDRvd RESOURCE "REL_VENDAS"
   REDEFINE GET oCt41 VAR dIni ID 41 OF oDRvd BITMAP ".\figuras\editar.bmp" ACTION RMMDT(oCt41, @dIni)
   REDEFINE GET oCt42 VAR dFim ID 42 OF oDRvd BITMAP ".\figuras\editar.bmp" ACTION RMMDT(oCt41, @dFim)
   REDEFINE GET oCt43 VAR nCli PICTURE "99999999999999" ID 43 OF oDRvd UPDATE VALID ObterClie(@nCli, @cCli, oDRvd)
   REDEFINE GET oCt44 VAR cCli ID 44 OF oDRvd MEMO UPDATE
   REDEFINE GET oCt45 VAR nVdd PICTURE "999" ID 45 OF oDRvd UPDATE VALID SeekOper(@nVdd, @cVdd, oDRvd)
   REDEFINE GET oCt46 VAR cVdd ID 46 OF oDRvd MEMO READONLY UPDATE
   REDEFINE COMBOBOX oId47 VAR cLoja ITEMS ArrTranspose(aTrnTo)[2] ID 47 OF oDRvd
   REDEFINE SBUTTON oSb31 PROMPT "Confirmar" ID 31 OF oDRvd RESOURCE "btn_prt" NOBORDER XP ACTION (lConf := .T., oDRvd:End())
   REDEFINE SBUTTON oSb32 PROMPT "Cancelar"  ID 32 OF oDRvd RESOURCE "btn_ret" NOBORDER XP ACTION (lConf := .F., oDRvd:End())
   ACTIVATE DIALOG oDRvd CENTERED
   
   if ! lConf ; RETURN NIL ; ENDIF

   IF (EMPTY(dIni) .OR. EMPTY(dFim)) .OR. (dIni > dFim)
      SysRefresh() ; MsgAlert("Período incorreto", "Aviso")
      RETURN NIL
   ENDIF
   
   cTitlo := "PERÍODO: "+DTOC(dIni)+" A "+DTOC(dFim)
   cWhere := "vendas_info.DTOPER >= '"+SR_dtosdot(dIni)+"' AND vendas_info.DTOPER <= '"+SR_dtosdot(dFim)+"'"
	IF VAL(nCli) > 0
      IF ! EMPTY(cWhere) ; cWhere += " AND " ; ENDIF
      cWhere += "vendas_info.DOCCPF = '"+ALLTRIM(nCli)+"'"
      IF ! EMPTY(cTitlo) ; cTitlo += "; " ; ENDIF
      cTitlo += "CLIENTE: "+ALLTRIM(cCli)
   ELSE
      IF !EMPTY(cCli)
         IF ! EMPTY(cWhere) ; cWhere += " AND " ; ENDIF
         cWhere += "vendas_info.NOMCLI LIKE '%"+ALLTRIM(cCli)+"%'"
         IF ! EMPTY(cTitlo) ; cTitlo += "; " ; ENDIF
         cTitlo += "CLIENTE: "+ALLTRIM(cCli)
      ENDIF
	ENDIF
	IF VAL(nVdd) > 0
      IF ! EMPTY(cWhere) ; cWhere += " AND " ; ENDIF
      cWhere += "vendas_info.VDDCOD = "+ALLTRIM(nVdd)
      IF ! EMPTY(cTitlo) ; cTitlo += "; " ; ENDIF
      cTitlo += "VENDEDOR: "+ALLTRIM(cVdd)
	ENDIF
	IF !EMPTY(cLoja)
      nScn := ASCAN(aTrnTo, {|CEL|CEL[2]=cLoja})
      nLoj := IIF(nScn > 0, aTrnTo[nScn,1], 0)
      IF nLoj > 0
         IF ! EMPTY(cWhere) ; cWhere += " AND " ; ENDIF
         cWhere += "vendas_info.IDLOJA = "+ALLTRIM(STR(nLoj))
         IF ! EMPTY(cTitlo) ; cTitlo += "; " ; ENDIF
         cTitlo += "LJ: "+ALLTRIM(cLoja)
      ENDIF
	ENDIF

   SqlArr := "SELECT vendas_info.CODIGO, "+;  // 01 - VND-Código do Movimento / Comanda / Mesa
                    "vendas_info.IDUNIC, "+;  // 02 - VND-ID único (Salvo em vendas, itens e contas relacionadas)
                    "vendas_info.IDLOJA, "+;  // 03 - VND-ID da loja
                    "vendas_info.ORCNUM, "+;  // 04 - VND-Número Orçamento / Comanda / Espera - Convertida para venda
                    "vendas_info.NFENUM, "+;  // 05 - VND-Nº da NF ou NF-e (NFC-e fica no ITEM99)
                    "vendas_info.NFCNUM, "+;  // 06 - VND-Número da NFC-e (NF-e no ITEM55, CF/CFE no ITEM19)
                    "vendas_info.SATNUM, "+;  // 07 - VND-Número do CFE/MFE/COO (SAT@MFE / ECF)
                    "vendas_info.OPERAC, "+;  // 08 - VND-Tipo de movimento (VENDA A VISTA / VENDA A PRAZO)
                    "vendas_info.CODCLI, "+;  // 09 - VND-Código do cliente
                    "vendas_info.NOMCLI, "+;  // 10 - VND-Nome do cliente / Razão social
                    "vendas_info.FANCLI, "+;  // 11 - VND-Nome de Fantasia
                    "vendas_info.RUACEP, "+;  // 12 - VND-CEP do cliente
                    "vendas_info.RUACLI, "+;  // 13 - VND-Endereço
                    "vendas_info.RUANRO, "+;  // 14 - VND-Nº de endereço do cliente
                    "vendas_info.BAIRRO, "+;  // 15 - VND-Bairro
                    "vendas_info.CIDADE, "+;  // 16 - VND-Cidade-UF
                    "vendas_info.RUAPER, "+;  // 17 - VND-Perímetro do endereço do cliente
                    "vendas_info.FONE01, "+;  // 18 - VND-Telefone
                    "vendas_info.DOCCPF, "+;  // 19 - VND-CPF/CNPJ
                    "vendas_info.DOC_RG, "+;  // 20 - VND-RG/IE
                    "vendas_info.DTOPER, "+;  // 21 - VND-Data da venda
                    "vendas_info.HORAOP, "+;  // 22 - VND-Hora da venda
                    "vendas_info.TITENS, "+;  // 23 - VND-Valor total dos itens. O tamanho na NF-e é 15,2
                    "vendas_info.DESCIT, "+;  // 24 - VND-Total descontos só nos itens - P/Controle de pontuação.
                    "vendas_info.DESCFI, "+;  // 25 - VND-Descontos (apenas os concedidos no fechamento)
                    "vendas_info.ACRESC, "+;  // 26 - VND-Acréscimo %
                    "vendas_info.ACRES1, "+;  // 27 - VND-Valor Mão-de-obra / Serviço / Couvert artístico
                    "vendas_info.ACRES2, "+;  // 28 - VND-Valor do Couvert por pessoa (Restaurante) (ITEN - com N mesmo - evitar conflito com DBF antigo).
                    "vendas_info.QTPESS, "+;  // 29 - VND-Quantidade de pessoas (Couvert é cobrado individualmente - multiplicar)
                    "vendas_info.VRPAGO, "+;  // 30 - VND-Valor pago Em dinheiro, sem tirar o troco, c/ 3 decimais
                    "vendas_info.PGTO01, "+;  // 31 - VND-Forma de pgto 1 - Dinheiro
                    "vendas_info.PGTO02, "+;  // 32 - VND-Forma de pgto 2 - Cheque 1
                    "vendas_info.PGTO03, "+;  // 33 - VND-Forma de pgto 3 - Cheque 2
                    "vendas_info.PGTO04, "+;  // 34 - VND-Forma de pgto 4 - Cartão 1
                    "vendas_info.PGTO05, "+;  // 35 - VND-Forma de pgto 5 - Cartão 2
                    "vendas_info.PGTO06, "+;  // 36 - VND-Forma de pgto 6 - Cartão 3
                    "vendas_info.PGTO07, "+;  // 37 - VND-Forma de pgto 7 - Cartão 4
                    "vendas_info.PGTO08, "+;  // 38 - VND-Forma de pgto 8 - Outros 1
                    "vendas_info.PGTO09, "+;  // 39 - VND-Forma de pgto 9 - Outros 2
                    "vendas_info.PGTO10, "+;  // 40 - VND-Forma de pgto 10- Outros 3
                    "vendas_info.PGTO11, "+;  // 41 - VND-Forma de pgto 11- Carta de crédito
                    "vendas_info.CARTAO, "+;  // 42 - VND-Parcelas/Bandeiras dos cartões crédito: Ex: 111222333444|B1|B2|B3|B4 (onde 111=Cartão 1 em NNN vezes|B1=Bandeira do cartão 1)
                    "vendas_info.OPERAD, "+;  // 43 - VND-Operador/Caixa/Lubrificador/Montador [000CCCCCCCCCCC...]
                    "vendas_info.VDDCOD, "+;  // 44 - VND-Código do vendedor
                    "vendas_info.VDDNOM, "+;  // 45 - VND-Nome do vendedor
                    "vendas_info.CARINF, "+;  // 46 - VND-Anotações sobre o carro
                    "vendas_info.CAR_KM, "+;  // 47 - VND-A=Km atual, R=A rodar, T=Km p/ troca. [AAAAAAAAAARRRRRRRRRRTTTTTTTTTT]
                    "vendas_info.CARMOD, "+;  // 48 - VND-Veículo do cliente
                    "vendas_info.CARPLA, "+;  // 49 - VND-Placa do veículo do cliente
                    "vendas_info.OBSERV, "+;  // 50 - VND-Observação. Ex: RECEBER NA ENTREGA
                    "vendas_itens.IDUMOV, "+; // 51 - ITN-ID único do movimento
                    "vendas_itens.CODMOV, "+; // 52 - ITN-Código do movimento
                    "vendas_itens.CODPRD, "+; // 53 - ITN-Código do produto
                    "vendas_itens.DESCRI, "+; // 54 - ITN-Descrição do produto
                    "vendas_itens.MEDLIN, "+; // 55 - ITN-Medida por metragem linear? >> ((Metros * Pr.Metro)*Qtd) = Total
                    "vendas_itens.MEDIDX, "+; // 56 - ITN-Medida X / Metros
                    "vendas_itens.MEDIDY, "+; // 57 - ITN-Medida Y / Pr.Metro
                    "vendas_itens.QUANTI, "+; // 58 - ITN-Quantidade
                    "vendas_itens.PRCOMP, "+; // 59 - ITN-Preço de compra
                    "vendas_itens.VRUNIT, "+; // 60 - ITN-Preço sem desconto - Compatível com NF-e 2.0
                    "vendas_itens.PRDESC, "+; // 61 - ITN-Preço com desconto - Compatível com NF-e 2.0
                    "vendas_itens.VRBRUT, "+; // 62 - ITN-Total com desconto. O tamanho na NF-e é 15,2
                    "vendas_itens.LOTENR, "+; // 63 - ITN-Número do lote
                    "vendas_itens.FABRIC, "+; // 64 - ITN-Fabricação
                    "vendas_itens.VALIDA, "+; // 65 - ITN-Validade
                    "vendas_itens.TABPRE"  +; // 66 - ITN-Tabela utilizada
            " FROM vendas_itens"+;
 				" LEFT JOIN vendas_info ON vendas_itens.IDUMOV=vendas_info.IDUNIC"+; // Undestanding JOINs: http://www.sitepoint.com/understanding-sql-joins-mysql-database/
 				" WHERE ("+cWhere+")"+; // WHERE clause mas be placed ahead of JOIN.
				" ORDER BY vendas_info.IDUNIC"

   aVdInfo := SQLArray(SqlArr, @l_Err)
   * XBrowse(aVdInfo, "Movimentos obtidos")

   IF LEN(aVdInfo) = 0
      SysRefresh() ; MsgAlert("Sem movimentação no período requisitado.", "Aviso")
      RETURN NIL
   ENDIF

   PRINTER oPrn TO SelectedPrn() NAME "Movimentos" PREVIEW
   oPrn:SetPortrait()
   DEFINE FONT oFont NAME "Courier New"  SIZE 0, -8  OF oPrn
   DEFINE FONT oFon1 NAME "Arial Narrow" SIZE 0, -10 OF oPrn
   DEFINE FONT oFon2 NAME "Arial"        SIZE 0, -14 OF oPrn BOLD
   DEFINE FONT oFon3 NAME "Arial"        SIZE 0, -12 OF oPrn
   DEFINE FONT oFon4 NAME "Arial Narrow" SIZE 0, -8  OF oPrn BOLD
   DEFINE PEN oPen COLOR CLR_BLACK WIDTH (oFont:nHeight/10)

   nRow  := 03
   nPag  := 01
   mLarg := oFont:nHeight
   nTab  := oPrn:nHorzRes() / 20
   nSpc  := (oPrn:nHorzRes()-(2*nTab)) / 90
   nCls  := {nTab+(nSpc*00),; // 1Cód Movimento
             nTab+(nSpc*10),; // 2-Cliente
             nTab+(nSpc*48),; // 3-Valor
             nTab+(nSpc*56),; // 4-Desconto
             nTab+(nSpc*64),; // 5-Liquido
             nTab+(nSpc*66),; // 6-Vendedor/Operador
             nTab+(nSpc*80),; // 7-F.Pg
             nTab+(nSpc*90) } // 8-Data

   oPrn:StartPage()

   oPrn:Box(03*mLarg, nTab, 11*mLarg, oPrn:nHorzRes()-nTab, oPen )
   oPrn:SayBitmap((4 * mLarg ), nTab+nSpc, ".\figuras\logomarc.bmp", 28*nSpc, 6*mLarg)
   nRow  := 4
   oPrn:Say(nRow*mLarg, nTab+(nSpc*30), "RAZÃO SOCIAL DA EMPRESA", oFon2 )
   nRow+=2
   oPrn:Say(nRow*mLarg, nTab+(nSpc*30), "ENDEREÇO DO ESTABELECIMENTO, N. 0 - BAIRRO", oFont )
   nRow++
   oPrn:Say(nRow*mLarg, nTab+(nSpc*30), "CIDADE - UF", oFont )
   oPrn:Say(nRow*mLarg, oPrn:nHorzRes()-(1.2*nTab), DTOC(DATE()), oFont,,,,1)
   nRow++
   oPrn:Say(nRow*mLarg, nTab+(nSpc*30), "TELEFONE", oFont )
   oPrn:Say(nRow*mLarg, oPrn:nHorzRes()-(1.2*nTab), LEFT(TIME(),5)+"h", oFont,,,,1)

   nRow += 4
   oPrn:Say(nRow*mLarg, nTab+(nSpc*45), "RELATÓRIO DE VENDAS - "+cTitlo, oFon4,,,,2)
   nRow++

   cIdUnq := aVdInfo[1,2]
   nItnVd := 1
   nTotVd := 0
   FOR nVn := 1 TO LEN(aVdInfo)
      IF cIdUnq <> aVdInfo[nVn,2] // Já é outra venda
         cIdUnq := aVdInfo[nVn,2]
         nItnVd := 1
      ENDIF
      IF nItnVd = 1 // Primeiro item da venda. Informações gerais.
         // Definir a principal forma de pagamento
         cFpg := ""
         IF aVdInfo[nVn,31] > 0 ; cFpg := "DIN" ; ENDIF // 1-Dinheiro
         IF aVdInfo[nVn,32] > 0 ; cFpg := "CHE" ; ENDIF // 2-Cheque
         IF aVdInfo[nVn,33] > 0 ; cFpg := "PRE" ; ENDIF // 3-Cheque pre
         IF aVdInfo[nVn,34] > 0 ; cFpg := "CRD" ; ENDIF // 4-Crd 1
         IF aVdInfo[nVn,35] > 0 ; cFpg := "CRD" ; ENDIF // 5-Crd 2
         IF aVdInfo[nVn,36] > 0 ; cFpg := "CRD" ; ENDIF // 6-Crd 3
         IF aVdInfo[nVn,37] > 0 ; cFpg := "CRD" ; ENDIF // 7-Crd 4
         IF aVdInfo[nVn,38] > 0 ; cFpg := "DEP" ; ENDIF // 8-Outros
         IF aVdInfo[nVn,39] > 0 ; cFpg := "CON" ; ENDIF // 9-Outros
         IF aVdInfo[nVn,40] > 0 ; cFpg := "OUT" ; ENDIF // 10-Outros
         // Imprimir informações gerais da venda
         FOR Y := 0 TO 89
             oPrn:Say(nRow*mLarg, nTab+(nSpc*Y), "-", oFont)
         NEXT
         nRow++
         oPrn:Say(nRow*mLarg, nCls[1], "COD.MOV.", oFon4 )
         oPrn:Say(nRow*mLarg, nCls[2], "CLIENTE", oFon4 )
         oPrn:Say(nRow*mLarg, nCls[3], "VALOR", oFon4,,,,1)
         oPrn:Say(nRow*mLarg, nCls[4], "DESC.", oFon4,,,,1)
         oPrn:Say(nRow*mLarg, nCls[5], "LIQUIDO", oFon4,,,,1)
         oPrn:Say(nRow*mLarg, nCls[6], "VENDEDOR", oFon4)
         oPrn:Say(nRow*mLarg, nCls[7], "F.PG", oFon4,,,,1)
         oPrn:Say(nRow*mLarg, nCls[8], "DATA", oFon4,,,,1)
         nRow++
         oPrn:Say(nRow*mLarg, nCls[1], ALLTRIM(STR(aVdInfo[nVn,1])), oFon4 )
         oPrn:Say(nRow*mLarg, nCls[2], ALLTRIM(STR(aVdInfo[nVn,9]))+"-"+ALLTRIM(aVdInfo[nVn,10]), oFon4 )
         oPrn:Say(nRow*mLarg, nCls[3], ALLTRIM(TRANS(aVdInfo[nVn,23], "@E 999,999,999.9999")), oFon4,,,,1)
         oPrn:Say(nRow*mLarg, nCls[4], ALLTRIM(TRANS(aVdInfo[nVn,25], "@E 999,999,999.99")), oFon4,,,,1)
         oPrn:Say(nRow*mLarg, nCls[5], ALLTRIM(TRANS(aVdInfo[nVn,23]-aVdInfo[nVn,25], "@E 999,999,999,999.99")), oFon4,,,,1)
         oPrn:Say(nRow*mLarg, nCls[6], ALLTRIM(STR(aVdInfo[nVn,44]))+"-"+ALLTRIM(aVdInfo[nVn,45]), oFon4 )
         oPrn:Say(nRow*mLarg, nCls[7], cFpg, oFon4,,,,1)
         oPrn:Say(nRow*mLarg, nCls[8], DTOC(aVdInfo[nVn,21])+" "+aVdInfo[nVn,22] , oFon4,,,,1)
         nTotVd += (aVdInfo[nVn,23]-aVdInfo[nVn,25])
         nRow += 1.5
         oPrn:Say(nRow*mLarg, nCls[1], "PRODUTO", oFon4 )
         oPrn:Say(nRow*mLarg, nCls[2], "DESCRIÇÃO", oFon4 )
         oPrn:Say(nRow*mLarg, nCls[3], "QTD", oFon4,,,,1)
         oPrn:Say(nRow*mLarg, nCls[4], "P.UNIT", oFon4,,,,1)
         oPrn:Say(nRow*mLarg, nCls[5], "TOTAL", oFon4,,,,1)
         nScn := ASCAN(aTrnTo, {|CEL|CEL[1]=aVdInfo[nVn,3]})
         IF nScn > 0
            oPrn:Say(nRow*mLarg, nCls[8], "LJ: "+ALLTRIM(aTrnTo[nScn,2]), oFon4,,,,1)
         ENDIF
         nRow++
      ENDIF
      
      // Imprimir itens da venda
      oPrn:Say(nRow*mLarg, nCls[1], ALLTRIM(STR(VAL(aVdInfo[nVn,53]))), oFon1 )
      oPrn:Say(nRow*mLarg, nCls[2], aVdInfo[nVn,54], oFon1 )
      oPrn:Say(nRow*mLarg, nCls[3], ALLTRIM(TRANS(aVdInfo[nVn,58], IIF(INT(aVdInfo[nVn,58]) <> aVdInfo[nVn,58], "@E 999,999,999.999", "999999999"))), oFon1,,,,1)
      oPrn:Say(nRow*mLarg, nCls[4], ALLTRIM(TRANS(aVdInfo[nVn,61], "@E 999,999,999.9999")), oFon1,,,,1)
      oPrn:Say(nRow*mLarg, nCls[5], ALLTRIM(TRANS(aVdInfo[nVn,62], "@E 999,999,999,999.99")), oFon1,,,,1)
      nRow++

      IF (nRow*mLarg) >= ( oPrn:nVertRes()-(10*mLarg) )
         oPrn:Say(oPrn:nVertRes()-(4*mLarg), nTab+(nSpc*45), "PAGINA: "+ALLTRIM(STR(nPag)), oFont,,,,2)
         oPrn:EndPage()
         oPrn:StartPage()
         nPag ++
         nRow := 3
         oPrn:Line(nRow*mLarg,nTab, nRow*mLarg,oPrn:nHorzRes()-nTab, oPen )
         oPrn:Say(nRow*mLarg, nTab+(nSpc*45), "RELATÓRIO DE VENDAS", oFon3,,,,2)
         nRow += 2
         oPrn:Line(nRow*mLarg,nTab, nRow*mLarg,oPrn:nHorzRes()-nTab, oPen )
         nRow++
      ENDIF
      nItnVd ++
   NEXT

   nRow += 1.25
   oPrn:Line(nRow*mLarg,nTab, nRow*mLarg,oPrn:nHorzRes()-nTab, oPen )
   nRow += 0.25

   oPrn:Say(nRow*mLarg, nCls[3], "VALOR TOTAL DAS VENDAS:", oFon2,,,,1)
   oPrn:Say(nRow*mLarg, nCls[5], ALLTRIM(TRANS(nTotVd, "@E 999,999,999,999.99")), oFon2,,,,1)

   oPrn:EndPage()
   oPrn:Preview()

   RELEASE FONT oFont, oFon1, oFon2, oFon3, oFon4

RETURN NIL

 

Link to comment
Share on other sites

2 horas atrás, sunset disse:

MYSQL 5.7

Na verdade eu estou abrindo a tabela como se fosse um DBF ainda 

           use estadual alias estad new shared
           if neterr()
              msginfo("Arquivo está em uso em modo exclusivo","Informação")
              close data
              retu
           endif
           set index to estadual
       

e usando o ALIS no xbrwse

 

    @ 0,0 XBROWSE oLbxEstadual          ;
                    Fields Iif(len(alltrim(estad->numecgc)) = 11,TRANSFORM(estad->numecgc,"@R 999.999.999-99"),TRANSFORM(estad->numecgc,"@R 99.999.999/9999-99")),;
                             estad->nomecli            ,;
                             estad->inscest            ,;
                             estad->siticms            ,;
                            estad->cida_de            ,;
                             estad->esta_do            ,;
                             estad->correio            ,;
                             estad->telefon             ;
                             Headers "Cnpj"            ,;
                             "Nome"                        ,;
                             "Inscrição"                ,;
                             "Situação"                   ,;
                             "Cidade"                    ,;
                             "UF"                           ,;
                             "Correio"                   ,;
                             "Telefone"                    ;
                             Fieldsizes 170,400,90,100,200,25,400,150;
                             Alias "estad"                  ;

 

Mas acredito que desta forma não vou ter resultado, vou executar um SELECT conforme indicado teria que colocar o resultado num array ?

 

 

Você pode usar as funções,

Sr_SetFilter(cSql)

Sr_DbRefresh()

DbGoto()

O comando cSql equivale cláusula Where do comando nativo SQL, dbsetorder(n) vai ser usado na na cláusula ORDER BY (só por curiosidade). Você acrescentando estas linhas antes do xbrowse, não haverá a necessidade de carregar um array. Se na sua tela tiver a opção GET, vc vai executando as funções que farão o filtro deixando cada vez mais rápido a exibição do dados...

Link to comment
Share on other sites

Bom dia e bom sábado a todos.

Usei a sugestão do FILTER mesmo, usei o sr_recno filtrando ate 2 milhões de registro que ficou um tempo "usável" de carregamento da tela e da manipulação no xBrowse,  quando o usuário precisar pesquisar algum registro, nome, cnpj e etc... então antes do Seek, estou FILTRANDO o banco "todo" com os 46 milhões de registro, exibo o conteúdo e após volto a filtro para 2 milhões de registros, se não fizer isso o xbrowse tenta carregar toda tabela novamente e só vai liberar 20 minutos depois a tela.

Agora usando o banco de dados aberto normal "sem exibição", funciona sem problemas, esta base estou usando para cadastrar clientes e fornecedores com CNPJ, na ficha do cliente quando digitar o CNPJ ele ja captura todos os dados, funciona sem problemas, rapido e etc... posteriormente vou montar um pequeno WS ou deixar numa base online para consultas via mySQL tambem, porem como o banco tem 29 GB não consigo colocar em nenhum site que não va ter um custo alto.

 

 

Grato a todos pelas dicas.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...