Ejemplo sencillo de factura

Ejemplo sencillo de factura

Postby Rosita » Tue Apr 12, 2016 8:37 pm

Hola a todos de regreso aqui con un pedido de ejemplo

Alguien que me pueda ayudar o facilitarme de como iniciar una captura sencilla de factura,su encabezado y tenga botones de Altas agregar registro,modificar registro y eliminar registro y con browse mi correo es rositatun@gmail.com ,espero no pedir mucho lo que solicito para tablas dbfs

gracias

Rosa
Rosita
 
Posts: 53
Joined: Tue Aug 18, 2015 7:34 pm

Re: Ejemplo sencillo de factura

Postby Silvio.Falconi » Tue Apr 12, 2016 9:49 pm

use xbrowse ...symply

Image



aBrowse := {{"PAITEM" ,i18n("Codice") ,nil ,50 },;
{ "PADESC" ,i18n("Descrizione") ,nil ,290 },;
{ "PAQTY" ,i18n("Quantità") ,"9999" ,45 },;
{ "PAMISURA" ,i18n("Misura") ,nil ,37 },;
{ "PAUNITARIO" ,i18n("Unitario") ,pict_money_Euro ,80 },;
{ "PASCONTO" ,i18n("%Sconto") , nil ,60 },;
{ "PAPROVV" ,i18n("%Provv.") ,'@ 999.99%' ,50 },;
{ "PARIT" ,i18n("Ritenuta") ,nil ,80 },;
{ "PAIVA" ,i18n("Iva") ,"99%" ,36 },;
{ "PATOTALE" ,i18n("Importo") ,pict_money_Euro ,80 }}




@ 0, 0.2 XBROWSE oBrw ;
OF oFld:adialogs[1] DATASOURCE "TB" ;
COLUMNS aBrowse CELL LINES FOOTERS NOBORDER FONT oFont


WITH OBJECT oBrw
WITH OBJECT oBrw:aCols[1]
:nEditType := EDIT_BUTTON
:bEditBlock := { | nRow, nCol, oCol, nKey | LookArt( nRow, nCol, oCol, nKey ) }
END


...


end

oBrw:SetRDD()
oBrw:CreateFromCode()
oBrw:lFooter:=.t.
oBrw:MakeTotals()
oBrw:RefreshFooters()

...return nil


Function LookArt( nRow, nCol, oCol, nKey )


return nil
Since from 1991/1992 ( fw for clipper Rel. 14.4 - Momos)
I use : FiveWin for Harbour November 2023 - January 2024 - Harbour 3.2.0dev (harbour_bcc770_32_20240309) - Bcc7.70 - xMate ver. 1.15.3 - PellesC - mail: silvio[dot]falconi[at]gmail[dot]com
User avatar
Silvio.Falconi
 
Posts: 7070
Joined: Thu Oct 18, 2012 7:17 pm

Re: Ejemplo sencillo de factura

Postby Rosita » Tue Apr 12, 2016 11:49 pm

Silvio.Falconi wrote:use xbrowse ...symply

Image



aBrowse := {{"PAITEM" ,i18n("Codice") ,nil ,50 },;
{ "PADESC" ,i18n("Descrizione") ,nil ,290 },;
{ "PAQTY" ,i18n("Quantità") ,"9999" ,45 },;
{ "PAMISURA" ,i18n("Misura") ,nil ,37 },;
{ "PAUNITARIO" ,i18n("Unitario") ,pict_money_Euro ,80 },;
{ "PASCONTO" ,i18n("%Sconto") , nil ,60 },;
{ "PAPROVV" ,i18n("%Provv.") ,'@ 999.99%' ,50 },;
{ "PARIT" ,i18n("Ritenuta") ,nil ,80 },;
{ "PAIVA" ,i18n("Iva") ,"99%" ,36 },;
{ "PATOTALE" ,i18n("Importo") ,pict_money_Euro ,80 }}




@ 0, 0.2 XBROWSE oBrw ;
OF oFld:adialogs[1] DATASOURCE "TB" ;
COLUMNS aBrowse CELL LINES FOOTERS NOBORDER FONT oFont


WITH OBJECT oBrw
WITH OBJECT oBrw:aCols[1]
:nEditType := EDIT_BUTTON
:bEditBlock := { | nRow, nCol, oCol, nKey | LookArt( nRow, nCol, oCol, nKey ) }
END


...


end

oBrw:SetRDD()
oBrw:CreateFromCode()
oBrw:lFooter:=.t.
oBrw:MakeTotals()
oBrw:RefreshFooters()

...return nil


Function LookArt( nRow, nCol, oCol, nKey )


return nil



gracias,pero buscaba mas funcional con sus botones de añadir nuevo registro y bajas de registro y modificacion de registro

alguien que me pueda apoyar con un trozo de codigo fuente de una captura de factura se los agradecere si me apoyan

Rosa
Rosita
 
Posts: 53
Joined: Tue Aug 18, 2015 7:34 pm

Re: Ejemplo sencillo de factura

Postby joseluisysturiz » Wed Apr 13, 2016 1:50 am

Saludos, aca te envio un codigo completo pero usando mysql, te servira de ejemplo y cualquier duda avisas y te ayudo adaptarlo, ya subire la imagen para q veas como se, gracias, saludos... :shock:

Image

Code: Select all  Expand view  RUN

#include "FiveWin.ch"
#include "XBrowse.ch"
#include "Splitter.ch"
#include "Dtpicker.ch"
#include "InKey.ch"

MEMVAR oDatos

FUNCTION mfacventas()

   LOCAL oDlg, nFor := 0, oError, oQBtn[2] ,;
         cQryCli, oQryCli, cQryVen, oQryVen, cQryTrn, oQryTrn ,;
         oBrw, oCol, aItems := {} ,;
         aBtn[10], aVar[30], aGet[30] ,;
         aCondi := { "CONTADO", "CREDITO" } ,;
         aStatus := { "ACTIVA ", "PAGADA ", "ANULADA" }

// APERTURA DE TABLAS RELACIONADAS...
   cQryCli := "SELECT * FROM clientes ORDER BY cli_codigo ASC"
   TRY
     oQryCli := TDolphinQry():New( cQryCli, oDatos:oConex )
   CATCH oError
      MSGSTOP( oError:description() + CRLF + CRLF + ;
               "Error Ejecución de Sentencia en Tabla(clientes): " + ;
               CRLF + CRLF + cQryCli, oDatos:cTitMsg )
      RETURN( NIL )
   END

   cQryVen := "SELECT * FROM vendedores ORDER BY ven_codigo ASC"

   TRY
     oQryVen := TDolphinQry():New( cQryVen, oDatos:oConex )
   CATCH oError
      MSGSTOP( oError:description() + CRLF + CRLF + ;
               "Error Ejecución de Sentencia en Tabla(vendedores): " + ;
               CRLF + CRLF + cQryVen, oDatos:cTitMsg )
      RETURN( NIL )
   END

   cQryTrn := "SELECT * FROM transporte ORDER BY trn_codigo ASC"

   TRY
     oQryTrn := TDolphinQry():New( cQryTrn, oDatos:oConex )
   CATCH oError
      MSGSTOP( oError:description() + CRLF + CRLF + ;
               "Error Ejecución de Sentencia en Tabla(transporte): " + ;
               CRLF + CRLF + cQryTrn, oDatos:cTitMsg )
      RETURN( NIL )
   END
// FIN APERTURA DE TABLAS RELACIONADAS...

// DEFINICION VARIABLES
   aVar[1] := SPACE(10) // COD.CLIENTE
   aVar[2] := SPACE(50) // NOMB.CLIENTE
   aVar[3] := SPACE(10) // COD.VENDEDOR
   aVar[4] := SPACE(50) // NOMB.VENDEDOR
   aVar[5] := SPACE(10) // COD.TRANS.
   aVar[6] := SPACE(50) // NOMB.TRANS.
   aVar[7] := SPACE(10) // COMENTARIOS(memo)
   aVar[8] := 1 // CONDICIONES(combo.box)
   aVar[9] := 0 // DIAS PLAZO CREDITO
   aVar[10] := 1 // ESTADO FACT.(combo.box)
   aVar[11] := DATE() // FCH.FACT.
   aVar[12] := DATE() // FCH.VENCE.
   aVar[13] := 0 // NUM.CONTROL
   aVar[14] := 0 // NUM.FACTURA

   FOR nFor := 15 TO 24 // INICIALIZO var EN CERO
      aVar[nFor] := 0.00
      if nFor == 23
         aVar[nFor] := -700
      endif
   NEXT

   aVar[17] := oDatos:oQryCnf:por_iva // VALOR DE TABLA config

   DEFINE DIALOG oDlg RESOURCE "FAC_COM-VTA" ;
      TITLE oDatos:cTitDlg + " - VENTAS - Facturas de Ventas" ;
      GRADIENT { { 1, nRGB( 125, 155, 175 ), nRGB( 125, 155, 175 ) } }

// EMPIEZA xBROWSE FACTURA...
   REDEFINE xBrowse oBrw ID 100 of oDlg ;
      HEADERS "CODIGO", "DESCRIPCION", "UNIDAD", "CANTIDAD", "PRECIO", "DESC", "SUB-TOTAL" ;
      COLUMNS 1, 2, 3, 4, 5, 6, 7 ;
      COLSIZES 100, 200, 70, 70, 70, 70, 70 ;
      JUSTIFY AL_LEFT, AL_LEFT, AL_LEFT, AL_RIGHT, AL_RIGHT, AL_RIGHT, AL_RIGHT ;
      PICTURES , , , "@E 9,999,999", "@E 9,999,999.99", "@E 999.99%", "@E 9,999,999.99" ;
      ARRAY aItems FASTEDIT LINES

// CONFIGURACION DEL xBROWSE
   WITH OBJECT oBrw
*      :nMarqueeStyle    := MARQSTYLE_HIGHLROW // NO PERMITE EDICION CELDA AUTO.
      :nMarqueeStyle    := MARQSTYLE_HIGHLCELL
      :nColDividerStyle := LINESTYLE_BLACK
      :nStretchCol      := STRETCHCOL_LAST
      :bRClicked := { || msginfo( "pulsastes boton derecho..." ) }  // LLAMA MENU-POPUP CON BOTON DERECHO
      :lColDividerComplete := .t.
      :nHeaderHeight := 30 // ANCHO CABEZERA
      :l2007 := .t.
      :lFooter := .t.
*      :lRecordSelector := .t. // SI/NO 1RA.COL.IZQ.QUE TIENE LA FLECHITA NEGRA
      :lAllowColHiding := .f. // SI/NO BOTON DERECHO SOBRE CABEZERA, MUESTRE ARRAY COL.
      :lAllowColSwapping := .f. // SI/NO INTERCAMBIAR COL.
      :bClrStd := {|| IF( oBrw:nArrayAt % 2 == 0, {CLR_BLACK, CLR_WHITE}, {0, RGB(203, 226, 254)} ) }
      :bKeyDown := {| nKey | teclado( nKey, oBrw, aVar, aGet ) } // CONTROLA VIRTUAL KEY
***:bPastEof := { || addrow( oBrw ) } // HACE EDICION DE CELDA AUTOMATICAMENTE CON FLECHA ABAJO...
   END WITH

// COLOR GRADIANTE EN XBROWSE...
oBrw:bClrGrad := { | lInvert | IF( ! lInvert, ;
   { { 0.710,8388608,16777215 }, ;
   {   0.710,16777215,8388608 } }, ;
   { { 0.710,8388608,16777215 }, ;
   {   0.710,16777215,8388608 } } ) }

// COL.1 - CODIGO PRODUCTO
   WITH OBJECT oBrw:aCols[1]
      :bStrData := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                            aItems[oBrw:nArrayAt, 1] ) }
      :cEditPicture := "@X"
        :nEditType    := EDIT_GET_BUTTON // EDIT_GET // EDIT_GET_LISTBOX
      :bEditBlock   := { || alert("Llamar maestro de Inventario") } // VALID BUTTON EN GET
        :bEditValid   := { | oGet, oCol | IF( !novacio( oGet:value ) , .f. ,;
                                            buscacodigo( oGet, oCol, oBrw ) ) } // VALIDA ANTES DE PERDER FOCUS
        :bOnPostEdit  := { | oCol, xVal, nKey | IF( nKey <> VK_ESCAPE ,; // DESPUES DE LA EDICION
                                                ( oCol:value := xVal ,;
                       aItems[oBrw:nArrayAt, 2] := "DESCRIPCION DEL PRODUCTO" ,;
                       oBrw:SelectCol( 4 ) ), ) } // MUEVO PUNTERO A COL(n)
      :bEditWhen     := {|| LEN( oBrw:aArrayData ) > 0 } // REVISAR ESTO....DA ERROR DE RANGO ARRAY....
      :bLClickHeader := { || alert("pulsaste boton izq.sobre cabecera col.") }
      :cToolTip := "usando ToolTips..."
   END WITH

// COL.2 - NOMBRE/DESCRIPCION
   WITH OBJECT oBrw:aCols[2]
      :bStrData := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                            aItems[oBrw:nArrayAt, 2] ) }
      :nEditType      := EDIT_BUTTON // EDIT_GET // EDIT_GET_LISTBOX
   END WITH

// COL.3 - UNIDAD
   WITH OBJECT oBrw:aCols[3]
      :bStrData      := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                           aItems[oBrw:nArrayAt, 3] ) }
      :cFooter       := "ITEMS =>"
      :nFootStrAlign := AL_RIGHT // ALINEA DATA FOOTER
        :nEditType     := EDIT_LISTBOX
      :aEditListTxt  := { "UNIDAD", "AGRU1", "AGRU2" }
      :bEditWhen     := {|| IF( EMPTY( aItems[oBrw:nArrayAt, 1] ), .f., .t. ) }
        :bOnPostEdit   := { | oCol, xVal, nKey | If( nKey <> VK_ESCAPE ,;
                                         ( oCol:value:= xVal, alert(xVal) ), ) }
   END WITH

// COL.4 - CANTIDAD
   WITH OBJECT oBrw:aCols[4]
      :bStrData      := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                                 aItems[oBrw:nArrayAt, 4] ) }
      :cEditPicture  := "@E 9,999,999"
      :nFootStrAlign := AL_RIGHT // ALINEA DATA FOOTER
      :lTotal        := .t. // PARA TOTALIZAR COL.
      :nTotal        := 0 // PARA TOTALIZAR COL.
      :nFooterType   := AGGR_SUM // PARA TOTALIZAR COL.
        :nEditType     := EDIT_GET
      :bEditValid    := { | oGet, oCol | mayorqcero( oGet:value() ) }
        :bOnPostEdit   := { | oCol, xVal, nKey | If( nKey <> VK_ESCAPE ,;
                                                 ( oCol:value := xVal ) , ) }
      :bEditWhen     := {|| !EMPTY( aItems[oBrw:nArrayAt, 1] ) }
   END WITH

// COL.5 - PVP
   WITH OBJECT oBrw:aCols[5]
      :bStrData      := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                                 aItems[oBrw:nArrayAt, 5] ) }
      :cEditPicture  := "@E 9,999,999.99"
      :nFootStrAlign := AL_RIGHT
        :nEditType     := EDIT_GET_BUTTON
      :bEditBlock   := { || alert("Seleccionar Varios Precios...") }
      :bEditValid    := { | oGet, oCol | mayorqcero( oGet:value() ) }
        :bOnPostEdit   := { | oCol, xVal, nKey | If( nKey <> VK_ESCAPE ,;
                                                 ( oCol:value := xVal ,;
                                                   totalinea( oBrw, aVar, aGet ) ), ) }
      :bEditWhen     := {|| !EMPTY( aItems[oBrw:nArrayAt, 1] ) }
   END WITH

// COL.6 - % DESCUENTO
   WITH OBJECT oBrw:aCols[6]
      :bStrData     := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                                 aItems[oBrw:nArrayAt, 6] ) }
      :cFooter      := "SUB-TOTAL=>"
      :cEditPicture := "@E 999.99 %"
        :nEditType    := EDIT_GET
      :bEditValid   := { | oGet, oCol | IF( menorqcero( oGet:value() ) ,;
                                          menorqcien( oGet:value() ), .f. ) }
        :bOnPostEdit   := { | oCol, xVal, nKey | If( nKey <> VK_ESCAPE ,;
                                                 ( oCol:value := xVal ,;
                                                   totalinea( oBrw, aVar, aGet ) ,;
                                                   addrow( oBrw ) ) , ) }
      :bEditWhen    := {|| !EMPTY( aItems[oBrw:nArrayAt, 1] ) .and. ;
                           aItems[oBrw:nArrayAt, 5] > 0 }
   END WITH

// COL.7 - TOTAL LINEA
   WITH OBJECT oBrw:aCols[7]
      :bStrData      := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                                 aItems[oBrw:nArrayAt, 7] ) }
      :cEditPicture  := "@E9,999,999.99"
      :nFootStrAlign := AL_RIGHT // ALINEA DATA FOOTER
      :lTotal        := .t. // PARA TOTALIZAR COL.
      :nTotal        := 0 // PARA TOTALIZAR COL.
      :nFooterType   := AGGR_SUM   // PARA TOTALIZAR COL.
      :cToolTip := "Columna 7"
   END WITH

   oBrw:MakeTotals()
   oBrw:Refresh()

// DATOS CLIENTE
   REDEFINE GET aGet[1] VAR aVar[1] ID 101 OF oDlg PICTURE "@!" UPDATE ; // COD.CLIENTE
      ACTION ( oQBtn := llamabrow( oQryCli, aVar[1], {"cli_codigo", "cli_nombre"} ,;
                                   {"Código", "Nombre"} ) ,;
               IIF( !oQBtn[1] ,;
                  ( alert("DEBE SELECCIONAR CLIENTE o ZERO PARA CLIENTE VARIOS...") ,;
                    aVar[2] := nil, aGet[2]:REFRESH(), .f. ) ,;
                  ( aVar[1] := oQBtn[2]:cli_codigo, aGet[1]:REFRESH() ,;
                    aVar[2] := oQBtn[2]:cli_nombre, aGet[2]:REFRESH() ,;
                    aGet[3]:SetFocus(), .t. ) ) ) ;
      VALID ( IIF( oQryCli:Seek( aVar[1], "cli_codigo" ) == 0 ,;
                 ( oQBtn := llamabrow( oQryCli, aVar[1], {"cli_codigo", "cli_nombre"} ,;
                                       {"Código", "Nombre"} ) ,;
                 ( IIF( !oQBtn[1] ,;
                      ( alert("DEBE SELECCIONAR CLIENTE o ZERO PARA CLIENTE VARIOS...") ,;
                        aVar[2] := nil, aGet[2]:REFRESH(), .f. ) ,;
                      ( aVar[1] := oQBtn[2]:cli_codigo, aGet[1]:REFRESH() ,;
                        aVar[2] := oQBtn[2]:cli_nombre, aGet[2]:REFRESH(), .t. ) ) ) ) ,;
                 ( alert("ENTRO VALOR QUE EXISTE") ,;
                   aVar[1] := oQryCli:cli_codigo, aGet[1]:REFRESH() ,;
                   aVar[2] := oQryCli:cli_nombre, aGet[2]:REFRESH(), .t. ) ) )

   REDEFINE GET aGet[2] VAR aVar[2] ID 102 OF oDlg UPDATE READONLY // NOMB.CLIENTE

   REDEFINE GET aGet[3] VAR aVar[3] ID 103 OF oDlg PICTURE "@!" UPDATE ; // COD.VENDEDOR
      ACTION ( oQBtn := llamabrow( oQryVen, aVar[3], {"ven_codigo", "ven_nombres"} ,;
                                   {"Código", "Nombre"} ) ,;
               IIF( !oQBtn[1] ,;
                  ( alert("DEBE SELECCIONAR VENDEDOR...") ,;
                    aVar[4] := nil, aGet[4]:REFRESH(), .f. ) ,;
                  ( aVar[3] := oQBtn[2]:ven_codigo, aGet[3]:REFRESH() ,;
                    aVar[4] := ALLTRIM( oQBtn[2]:ven_nombres ) + " " + ;
                               ALLTRIM( oQBtn[2]:ven_apellidos ) ,;
                    aGet[4]:REFRESH() ,;
                    aGet[5]:SetFocus(), .t. ) ) ) ;
      VALID ( IIF( oQryVen:Seek( aVar[3], "ven_codigo" ) == 0 ,;
                 ( oQBtn := llamabrow( oQryVen, aVar[3], {"ven_codigo", "ven_nombres"} ,;
                                       {"Código", "Nombre"} ) ,;
                 ( IIF( !oQBtn[1] ,;
                      ( alert("DEBE SELECCIONAR VENDEDOR...") ,;
                        aVar[4] := nil, aGet[4]:REFRESH(), .f. ) ,;
                      ( aVar[3] := oQBtn[2]:ven_codigo, aGet[3]:REFRESH() ,;
                        aVar[4] := ALLTRIM( oQBtn[2]:ven_nombres ) + " " + ;
                                   ALLTRIM( oQBtn[2]:ven_apellidos ) ,;
                        aGet[4]:REFRESH(), .t. ) ) ) ) ,;
                 ( alert("ENTRO VALOR QUE EXISTE") ,;
                   aVar[3] := oQryVen:ven_codigo, aGet[3]:REFRESH() ,;
                   aVar[4] := oQryVen:ven_nombres, aGet[4]:REFRESH(), .t. ) ) )

   REDEFINE GET aGet[4] VAR aVar[4] ID 104 OF oDlg UPDATE READONLY // NOMB.VENDEDOR

   REDEFINE GET aGet[5] VAR aVar[5] ID 105 OF oDlg PICTURE "@!" UPDATE ; // COD.TRANS.
      ACTION ( oQBtn := llamabrow( oQryTrn, aVar[5], {"trn_codigo", "trn_nombre"} ,;
                                   {"Código", "Nombre"} ) ,;
               IIF( !oQBtn[1] ,;
                  ( alert("DEBE SELECCIONAR TRANSPORTE...") ,;
                    aVar[6] := nil, aGet[6]:REFRESH(), .f. ) ,;
                  ( aVar[5] := oQBtn[2]:trn_codigo, aGet[5]:REFRESH() ,;
                    aVar[6] := oQBtn[2]:trn_nombre, aGet[6]:REFRESH() ,;
                    aGet[7]:SetFocus(), .t. ) ) ) ;
      VALID ( IIF( oQryTrn:Seek( aVar[5], "trn_codigo" ) == 0 ,;
                 ( oQBtn := llamabrow( oQryTrn, aVar[5], {"trn_codigo", "trn_nombre"} ,;
                                       {"Código", "Nombre"} ) ,;
                 ( IIF( !oQBtn[1] ,;
                      ( alert("DEBE SELECCIONAR TRANSPORTE...") ,;
                        aVar[6] := nil, aGet[6]:REFRESH(), .f. ) ,;
                      ( aVar[5] := oQBtn[2]:trn_codigo, aGet[5]:REFRESH() ,;
                        aVar[6] := oQBtn[2]:trn_nombre, aGet[6]:REFRESH(), .t. ) ) ) ) ,;
                 ( alert("ENTRO VALOR QUE EXISTE") ,;
                   aVar[5] := oQryTrn:trn_codigo, aGet[5]:REFRESH() ,;
                   aVar[6] := oQryTrn:trn_nombre, aGet[6]:REFRESH(), .t. ) ) )

   REDEFINE GET aGet[6] VAR aVar[6] ID 106 OF oDlg UPDATE READONLY // NOMB.TRANS.

   REDEFINE GET aGet[7] VAR aVar[7] MEMO ID 107 OF oDlg MULTILINE // COMENTARIOS

   REDEFINE COMBOBOX aGet[8] VAR aVar[8] ITEMS aCondi ID 108 OF oDlg UPDATE // CONDICIONES

   REDEFINE GET aGet[9] VAR aVar[9] ID 109 OF oDlg PICTURE "@E 9,999" UPDATE ; // DIAS PLAZO
      VALID( menorqcero( aVar[9] ) ) ;
      WHEN ( aVar[8] == 2 )

   REDEFINE COMBOBOX aGet[10] VAR aVar[10] ITEMS aStatus ID 110 OF oDlg UPDATE // STATUS

   REDEFINE DTPICKER aGet[11] VAR aVar[11] ID 111 OF oDlg UPDATE ; // FCH.FACT.
      VALID( IIF( !validfecha( aVar[11] ), .f. ,;
                ( aVar[12] := aVar[11] + aVar[9], aGet[12]:REFRESH(), .t. ) ) )

   REDEFINE GET aGet[12] VAR aVar[12] ID 112 OF oDlg UPDATE READONLY // FCH.VENCE

   REDEFINE GET aGet[13] VAR aVar[13] ID 113 OF oDlg PICTURE "9999999999" UPDATE ; // NUM.CONTROL
      VALID( IIF( !mayorqcero( aVar[13] ), .f., ( aVar[13] := STRZERO( aVar[13], 10 ) ,;
                               aGet[13]:REFRESH() ,;
                               addrow( oBrw ), .t. ) ) )

   REDEFINE GET aGet[14] VAR aVar[14] ID 114 OF oDlg PICTURE "9999999999" UPDATE ; // NUM.FACTURA
      READONLY

// DESC. IVA Y TOTALES FACTURA
// DESCUENTOS
   REDEFINE GET aGet[15] VAR aVar[15] ID 115 OF oDlg PICTURE "@E 999.99" UPDATE ; // % DESC.SOBRE MTO.BRUTO
      VALID( IIF( aVar[15] >= 0, netopagar( aVar[18], aVar, aGet ), .t. ) )

   REDEFINE GET aGet[16] VAR aVar[16] ID 116 OF oDlg PICTURE "@E 9,999,999.99" UPDATE ; // MTO.DESC.SOBRE MTO.BRUTO
      VALID( IIF( aVar[16] >= 0, netopagar( aVar[18], aVar, aGet ), .t. ) )
// IVA
   REDEFINE GET aGet[17] VAR aVar[17] ID 117 OF oDlg PICTURE "@E 999.99" // % IVA
// TOTALES
   REDEFINE GET aGet[18] VAR aVar[18] ID 118 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.SIN IVA
   REDEFINE GET aGet[19] VAR aVar[19] ID 119 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.DESC.
   REDEFINE GET aGet[20] VAR aVar[20] ID 120 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.IVA
   REDEFINE GET aGet[21] VAR aVar[21] ID 121 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.NETO PAGAR
   REDEFINE GET aGet[22] VAR aVar[22] ID 122 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.SIN IVA - MTO.DESC.
   REDEFINE GET aGet[23] VAR aVar[23] ID 123 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.EXENTO(no paga imp.)

// BOTONES CUERPO FACTURA
   REDEFINE BUTTONBMP aBtn[1] ID 201 OF oDlg UPDATE ; // INC.REG.
      ACTION ( addrow( oBrw ) ) ;
      BITMAP "incluir32" PROMPT "Incluir" + CRLF + "[F2]"

   REDEFINE BUTTONBMP aBtn[2] ID 202 OF oDlg ; // MOD.REG.
      ACTION ( alert("en construccion...") ) ;//ACTION ( modrow( oBrw ) ) ;
      BITMAP "modificar32" PROMPT "Modificar" + CRLF + "[F3]" ;
      WHEN ( LEN( oBrw:aArrayData ) > 0 ) UPDATE

   REDEFINE BUTTONBMP aBtn[3] ID 203 OF oDlg ; // ELI.REG.
      ACTION ( delrow( oBrw, aVar, aGet ) ) ;
      BITMAP "eliminar32" PROMPT "E&liminar" + CRLF + "[F4]" ;
      WHEN ( LEN( oBrw:aArrayData ) > 0 ) UPDATE

   REDEFINE BUTTONBMP aBtn[4] ID 204 OF oDlg ; // BUSCAR REG.
      ACTION ( alert("buscar reg.") ) ;
      BITMAP "buscar32" PROMPT "B&uscar" + CRLF + "[F5]" ;
      WHEN ( LEN( oBrw:aArrayData ) > 0 ) UPDATE

   REDEFINE BUTTONBMP aBtn[5] ID 205 OF oDlg UPDATE ; // CANCELAR FACT.
      ACTION ( oDlg:END() ) ;
      BITMAP "Cancelar32" PROMPT "Cancelar" + CRLF + "[F6]"

   REDEFINE BUTTONBMP aBtn[6] ID 206 OF oDlg UPDATE ; // FINALIZAR FACT.
      ACTION ( alert("Fin Factura"), grabafactu( .t., .t., aVar, oBrw ), oDlg:END() ) ;
      BITMAP "finalizar32" PROMPT "&Finalizar" + CRLF + "[F7]" ;//WHEN ( aVar[21] > 0 )

   REDEFINE BUTTONBMP aBtn[7] ID 207 OF oDlg ; // IMP.RENGLONES
      ACTION ( alert("Importar renglon desde...") ) ;
      BITMAP "importar32" PROMPT "&Importar" + CRLF + "[F12]" ;
      WHEN ( LEN( oBrw:aArrayData ) > 0 ) UPDATE

   aBtn[5]:lCancel := .t.

// FIN BOTONES CUERPO FACTURA

   ACTIVATE DIALOG oDlg CENTER

   oQryCli:END(); oQryVen:END(); oQryTrn:END()

RETURN ( .t. )

STATIC FUNCTION buscacodigo( oGet, oCol, oBrw ) // BUSCO CODIGO
*   ? "busco codigo..."
RETURN ( .t. )

STATIC FUNCTION addrow( oBrw ) // ADICIONO REGISTRO

   IF LEN( oBrw:aArrayData ) > 0
      oBrw:GoBottom()

      IF oBrw:aArrayData[ oBrw:nArrayAt, 7] > 0
         AADD( oBrw:aArrayData ,;
             { , , "UNIDAD", 0, 0, 0, 0 } )
      ENDIF
   ELSE
      AADD( oBrw:aArrayData ,;
          { , , "UNIDAD", 0, 0, 0, 0 } )
   ENDIF

   oBrw:SetPos( , 1, ) // MUEVE PUNTO A COL.1
   oBrw:GoBottom()
   oBrw:Refresh()
   oBrw:SetFocus()

RETURN nil

STATIC FUNCTION modirow( oBrw ) // MODIFICAR REGISTRO

   oBrw:SetPos( , 1, ) // MUEVE PUNTO A COL.1
   oBrw:Refresh()
   oBrw:SetFocus()

RETURN nil

STATIC FUNCTION totalinea( oBrw, aVar, aGet ) // TOTAL POR RENGLON CON Y SIN DESC.
// TOTAL = CANTIDAD * PRECIO
   oBrw:aArrayData[oBrw:nArrayAt, 7] := ;
       ( oBrw:aArrayData[oBrw:nArrayAt, 4] * oBrw:aArrayData[oBrw:nArrayAt, 5] )

// TOTAL = TOTAL - MTO.DESCUENTO
   oBrw:aArrayData[oBrw:nArrayAt, 7] := ;
       oBrw:aArrayData[oBrw:nArrayAt, 7] - ;
       ( oBrw:aArrayData[oBrw:nArrayAt, 7] * oBrw:aArrayData[oBrw:nArrayAt, 6] / 100 )

   oBrw:MakeTotals(); oBrw:Refresh()
   netopagar( oBrw:aCols[7]:nTotal, aVar, aGet ) // CALCULA NETO PAGAR

RETURN nil

STATIC FUNCTION netopagar( nSTotal, aVar, aGet ) // CALCULA NETO PAGAR

   LOCAL nFor := 0

   aVar[18] := nSTotal // MTO.SIN IVA NI DESCUENTO
   aVar[19] := aVar[16] + ( aVar[18] * aVar[15] ) / 100 // MTO.DESCUENTO GENERAL
   aVar[22] := aVar[18] - aVar[19]
   aVar[20] := ( ( ( aVar[18]-aVar[19] ) * aVar[17] ) / 100 ) // MTO.IVA SEGUN TASA ACTIVA
   aVar[21] := ( aVar[18] - aVar[19] ) + aVar[20]

   FOR nFor := 18 TO 22
      aGet[nFor]:REFRESH()
   NEXT

RETURN ( .t. )

STATIC FUNCTION delrow( oBrw, aVar, aGet ) // ELIMINO REGISTRO

   IF LEN( oBrw:aArrayData ) == 0
      MSGINFO( "No hay Registro(s) para Eliminar...", oDatos:cTitMsg )
      RETURN nil
   ENDIF

   IF MSGNOYES( "Seguro Desea ELIMINAR el Registro: " + ;
      ALLTRIM( cValToChar( oBrw:aArrayData[oBrw:nArrayAt, 1] ) ) + " ?", oDatos:cTitMsg )
      IF oBrw:nLen > 0
         ADEL( oBrw:aArrayData, oBrw:nArrayAt )
         ASIZE( oBrw:aArrayData, oBrw:nLen - 1 )
      ENDIF
   ENDIF

   oBrw:GOTOP()
   oBrw:SetFocus()
   oBrw:MakeTotals()
   oBrw:Refresh()

   netopagar( oBrw:aCols[7]:nTotal, aVar, aGet ) // CALCULA NETO PAGAR

RETURN nil

FUNCTION grabafactu( lNew, lTipoVta, aVar, oBrwMFV ) // GRABO FACTURA Y CUERPO FACTURA
// lNew -> FACTURA NUEVA/MODIFICADA
// lTipoVta -> CONTROLA TIPO VTA. FACT.VTA.CON PRODUCTOS(.t.) / DOCUMENTO(.f.)
// aVar -> DATOS CABEZERA Y TOTALES DE FV.
// oBrwMFV -> MAESTRO DE FV.

   LOCAL cQryFV, cQryMFV, cQryCNF, oError ,;
         nFor := 0, nFactura := 0

   IF aVar[21] == 0 // SI POR ALGUN MOTIVO LLEGA SIN MONTO
      alert("factura sin mto.neto...")
      RETURN .t.
   ENDIF

   oDatos:oQryCnf:REFRESH() // REFRESCO TABLA config, QUERY PUBLICO
   nFactura := oDatos:oQryCnf:num_factura
   nFactura := nFactura + 1 // DEBO HACER nFac = AL No.MAS ALTO EN config + 1

   IF oDatos:oQryCnf:LastRec() = 0 // VERIFICO SI TABLA ESTA VACIA
      cQryCNF := "INSERT INTO config SET num_factura = ' " + ClipValue2SQL( nFactura ) + "'"
   ELSE
      cQryCNF := "UPDATE config SET num_factura = ' " + ClipValue2SQL( nFactura ) + "'"
   ENDIF

   TRY
      oDatos:oConex:Execute( cQryCNF )
   CATCH oError
      MSGSTOP( oError:Description + CRLF + "Error Grabando en Tabla (config), Sentencia" + ;
               CRLF + CRLF + cQryCNF, oDatos:cTitMsg )
   END

   oDatos:oQryCnf:REFRESH()

   aVar[14] := nFactura // ACTUALIZO NUM.FACT.PARA GRABAR EN facturas

// GRABO FACTURA
   IF lNew
      cQryFV := "INSERT INTO facturas SET "
      cQryFV += "fac_numfac=" + ClipValue2SQL( aVar[14] ) + ","
   ELSE
      cQryFV := "UPDATE facturas SET "
   ENDIF

   cQryFV += "fac_codicli="     + ClipValue2SQL( aVar[1] ) + ","
   cQryFV += "fac_nombcli="     + ClipValue2SQL( aVar[2] ) + ","
   cQryFV += "fac_codiven="     + ClipValue2SQL( aVar[3] ) + ","
   cQryFV += "fac_nombven="     + ClipValue2SQL( aVar[4] ) + ","
   cQryFV += "fac_coditrans="   + ClipValue2SQL( aVar[5] ) + ","
   cQryFV += "fac_nombtrans="   + ClipValue2SQL( aVar[6] ) + ","
   cQryFV += "fac_comentarios=" + ClipValue2SQL( Val2Escape( aVar[7] ) ) + ","
   cQryFV += "fac_condiciones=" + ClipValue2SQL( aVar[8] ) + ","
   cQryFV += "fac_diasplazo="   + ClipValue2SQL( aVar[9] ) + ","
   cQryFV += "fac_status="      + ClipValue2SQL( aVar[10] ) + ","
   cQryFV += "fac_fchfac="      + ClipValue2SQL( aVar[11] ) + ","
   cQryFV += "fac_fchvence="    + ClipValue2SQL( aVar[12] ) + ","
   cQryFV += "fac_numctrl="     + ClipValue2SQL( aVar[13] ) + ","
//
   cQryFV += "fac_pordesc="     + ClipValue2SQL( aVar[15] ) + ","
   cQryFV += "fac_mtodesc="     + ClipValue2SQL( aVar[16] ) + ","
   cQryFV += "fac_poriva="      + ClipValue2SQL( aVar[17] ) + ","
   cQryFV += "fac_mtototal="    + ClipValue2SQL( aVar[18] ) + ","
   cQryFV += "fac_totdesc="     + ClipValue2SQL( aVar[19] ) + ","
   cQryFV += "fac_mtosobre="    + ClipValue2SQL( aVar[22] ) + ","
   cQryFV += "fac_mtoiva="      + ClipValue2SQL( aVar[20] ) + ","
   cQryFV += "fac_mtoexento="   + ClipValue2SQL( aVar[23] ) + ","
   cQryFV += "fac_neto="        + ClipValue2SQL( aVar[21] ) + ","
   cQryFV += "usuario="         + ClipValue2SQL( Val2Escape( "JL" ) ) + ","
   cQryFV += "fchcrea="         + ClipValue2SQL( DATE() )


   TRY // GRABO EN LA TABLA...
      oDatos:oConex:Execute( cQryFV )
   CATCH oError
      MSGSTOP( oError:Description + CRLF + "Error Grabando en Tabla (factura), Sentencia" + ;
               CRLF + CRLF + cQryFV, oDatos:cTitMsg )
   END
// FIN GRABO DATOS FACTURA / DOCUMENTO

return .t.

   IF !lTipoVta // VTA.DOCUMENTO
      RETURN .t.
   ENDIF

// GRABO CUERPO FACTURA
   IF lNew // SIEMPE ES NUEVA, SI SE USA MODIFICAR FV SE CAMBIARA
      FOR nFor := 1 TO LEN( oBrwMFV:aArrayData )
         cQryMFV := "INSERT INTO movi_facturas SET "
         cQryMFV += "cod_producto=" + ClipValue2SQL( oBrwMFV:aArrayData[nFor,1] ) + ","
         cQryMFV += "nom_producto=" + ClipValue2SQL( oBrwMFV:aArrayData[nFor,2] ) + ","
         cQryMFV += "cantidad=" + ClipValue2SQL( oBrwMFV:aArrayData[nFor,3] ) + ","
         cQryMFV += "pvp=" + ClipValue2SQL( oBrwMFV:aArrayData[nFor,4] ) + ","
         cQryMFV += "stotal=" + ClipValue2SQL( oBrwMFV:aArrayData[nFor,5] ) + ","
         cQryMFV += "poriva=" + ClipValue2SQL( oDatos:oQryCnf:por_iva ) + ","
         //
         cQryMFV += "cedula=" + ClipValue2SQL( Val2Escape( aVar[1] ) ) + ","
         cQryMFV += "num_inscripcion=" + ClipValue2SQL( aVar[2] ) + ","
         cQryMFV += "num_factura=" + ClipValue2SQL( aVar[4] ) + ","
         cQryMFV += "fch_movimiento=" + ClipValue2SQL( aVar[3] ) + ","
         cQryMFV += "cod_asesor=" + ClipValue2SQL( Val2Escape( aVar[11] ) ) + ","
         cQryMFV += "nom_asesor=" + ClipValue2SQL( Val2Escape( aVar[12] ) ) + ","
         cQryMFV += "grupo=" + ClipValue2SQL( Val2Escape( aVar[14] ) ) + ","
         //
         cQryMFV += "usuario=" + ClipValue2SQL( 00 ) + ","
         cQryMFV += "fchcrea="    + ClipValue2SQL( DATE() ) //+ ","

         TRY // GRABO EN LA TABLA...
            oDatos:oConex:Execute( cQryMFV )
         CATCH oError
            MSGSTOP( oError:Description + CRLF + "Error Grabando en Tabla (movi_facturas), Sentencia" + ;
                     CRLF + CRLF + cQryMFV, oDatos:cTitMsg )
         END
      NEXT
   ENDIF
// FIN GRABO CUERPO FACTURA

RETURN .t. //( aVar )

STATIC FUNCTION teclado( nKey, oBrw, aVar, aGet ) // CONTROLA TECLA PRESIONADA CUANDO xBRW TIENE FOCUS

   DO CASE
      CASE nKey == VK_DELETE .or. nKey == VK_F4 // ELIMINAR REGISTRO(Supr/F4)
           delrow( oBrw, aVar, aGet )

      CASE nKey == VK_F2 // ADICIONA REGISTRO CON TECLA DE FUNCION...
           addrow( oBrw )

      CASE nKey == VK_F3 // MODIFICAR REGISTRO CON TECLA DE FUNCION...
           modirow( oBrw )

      CASE nKey == VK_F7
           alert("F7...")
           grabafactu( .t., .t., aVar, oBrw )

      CASE nKey == VK_F12
           alert("pulso F12")

      CASE nKey == VK_F11
           alert("pulso F11")

      CASE nKey == VK_F10     // NO FUNCIONA
           alert("pulso F10")

      CASE nKey == VK_F9
           alert("pulso F9")

      CASE nKey == VK_F8
           alert("pulso F8")

      CASE nKey == VK_F6
           alert("pulso F6")

      CASE nKey == VK_F5
           alert("pulso F5")

      CASE nKey == VK_INSERT
           alert("insertar Reg.")

      CASE nKey == VK_DOWN
           alert("pa´bajo")

      CASE nKey == VK_UP
           alert("pa´rriba")

   END CASE

RETURN nil
 
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Ejemplo sencillo de factura

Postby Rosita » Wed Apr 13, 2016 2:24 pm

joseluisysturiz wrote:Saludos, aca te envio un codigo completo pero usando mysql, te servira de ejemplo y cualquier duda avisas y te ayudo adaptarlo, ya subire la imagen para q veas como se, gracias, saludos... :shock:

Image

Code: Select all  Expand view  RUN

#include "FiveWin.ch"
#include "XBrowse.ch"
#include "Splitter.ch"
#include "Dtpicker.ch"
#include "InKey.ch"

MEMVAR oDatos

FUNCTION mfacventas()

   LOCAL oDlg, nFor := 0, oError, oQBtn[2] ,;
         cQryCli, oQryCli, cQryVen, oQryVen, cQryTrn, oQryTrn ,;
         oBrw, oCol, aItems := {} ,;
         aBtn[10], aVar[30], aGet[30] ,;
         aCondi := { "CONTADO", "CREDITO" } ,;
         aStatus := { "ACTIVA ", "PAGADA ", "ANULADA" }

// APERTURA DE TABLAS RELACIONADAS...
   cQryCli := "SELECT * FROM clientes ORDER BY cli_codigo ASC"
   TRY
     oQryCli := TDolphinQry():New( cQryCli, oDatos:oConex )
   CATCH oError
      MSGSTOP( oError:description() + CRLF + CRLF + ;
               "Error Ejecución de Sentencia en Tabla(clientes): " + ;
               CRLF + CRLF + cQryCli, oDatos:cTitMsg )
      RETURN( NIL )
   END

   cQryVen := "SELECT * FROM vendedores ORDER BY ven_codigo ASC"

   TRY
     oQryVen := TDolphinQry():New( cQryVen, oDatos:oConex )
   CATCH oError
      MSGSTOP( oError:description() + CRLF + CRLF + ;
               "Error Ejecución de Sentencia en Tabla(vendedores): " + ;
               CRLF + CRLF + cQryVen, oDatos:cTitMsg )
      RETURN( NIL )
   END

   cQryTrn := "SELECT * FROM transporte ORDER BY trn_codigo ASC"

   TRY
     oQryTrn := TDolphinQry():New( cQryTrn, oDatos:oConex )
   CATCH oError
      MSGSTOP( oError:description() + CRLF + CRLF + ;
               "Error Ejecución de Sentencia en Tabla(transporte): " + ;
               CRLF + CRLF + cQryTrn, oDatos:cTitMsg )
      RETURN( NIL )
   END
// FIN APERTURA DE TABLAS RELACIONADAS...

// DEFINICION VARIABLES
   aVar[1] := SPACE(10) // COD.CLIENTE
   aVar[2] := SPACE(50) // NOMB.CLIENTE
   aVar[3] := SPACE(10) // COD.VENDEDOR
   aVar[4] := SPACE(50) // NOMB.VENDEDOR
   aVar[5] := SPACE(10) // COD.TRANS.
   aVar[6] := SPACE(50) // NOMB.TRANS.
   aVar[7] := SPACE(10) // COMENTARIOS(memo)
   aVar[8] := 1 // CONDICIONES(combo.box)
   aVar[9] := 0 // DIAS PLAZO CREDITO
   aVar[10] := 1 // ESTADO FACT.(combo.box)
   aVar[11] := DATE() // FCH.FACT.
   aVar[12] := DATE() // FCH.VENCE.
   aVar[13] := 0 // NUM.CONTROL
   aVar[14] := 0 // NUM.FACTURA

   FOR nFor := 15 TO 24 // INICIALIZO var EN CERO
      aVar[nFor] := 0.00
      if nFor == 23
         aVar[nFor] := -700
      endif
   NEXT

   aVar[17] := oDatos:oQryCnf:por_iva // VALOR DE TABLA config

   DEFINE DIALOG oDlg RESOURCE "FAC_COM-VTA" ;
      TITLE oDatos:cTitDlg + " - VENTAS - Facturas de Ventas" ;
      GRADIENT { { 1, nRGB( 125, 155, 175 ), nRGB( 125, 155, 175 ) } }

// EMPIEZA xBROWSE FACTURA...
   REDEFINE xBrowse oBrw ID 100 of oDlg ;
      HEADERS "CODIGO", "DESCRIPCION", "UNIDAD", "CANTIDAD", "PRECIO", "DESC", "SUB-TOTAL" ;
      COLUMNS 1, 2, 3, 4, 5, 6, 7 ;
      COLSIZES 100, 200, 70, 70, 70, 70, 70 ;
      JUSTIFY AL_LEFT, AL_LEFT, AL_LEFT, AL_RIGHT, AL_RIGHT, AL_RIGHT, AL_RIGHT ;
      PICTURES , , , "@E 9,999,999", "@E 9,999,999.99", "@E 999.99%", "@E 9,999,999.99" ;
      ARRAY aItems FASTEDIT LINES

// CONFIGURACION DEL xBROWSE
   WITH OBJECT oBrw
*      :nMarqueeStyle    := MARQSTYLE_HIGHLROW // NO PERMITE EDICION CELDA AUTO.
      :nMarqueeStyle    := MARQSTYLE_HIGHLCELL
      :nColDividerStyle := LINESTYLE_BLACK
      :nStretchCol      := STRETCHCOL_LAST
      :bRClicked := { || msginfo( "pulsastes boton derecho..." ) }  // LLAMA MENU-POPUP CON BOTON DERECHO
      :lColDividerComplete := .t.
      :nHeaderHeight := 30 // ANCHO CABEZERA
      :l2007 := .t.
      :lFooter := .t.
*      :lRecordSelector := .t. // SI/NO 1RA.COL.IZQ.QUE TIENE LA FLECHITA NEGRA
      :lAllowColHiding := .f. // SI/NO BOTON DERECHO SOBRE CABEZERA, MUESTRE ARRAY COL.
      :lAllowColSwapping := .f. // SI/NO INTERCAMBIAR COL.
      :bClrStd := {|| IF( oBrw:nArrayAt % 2 == 0, {CLR_BLACK, CLR_WHITE}, {0, RGB(203, 226, 254)} ) }
      :bKeyDown := {| nKey | teclado( nKey, oBrw, aVar, aGet ) } // CONTROLA VIRTUAL KEY
***:bPastEof := { || addrow( oBrw ) } // HACE EDICION DE CELDA AUTOMATICAMENTE CON FLECHA ABAJO...
   END WITH

// COLOR GRADIANTE EN XBROWSE...
oBrw:bClrGrad := { | lInvert | IF( ! lInvert, ;
   { { 0.710,8388608,16777215 }, ;
   {   0.710,16777215,8388608 } }, ;
   { { 0.710,8388608,16777215 }, ;
   {   0.710,16777215,8388608 } } ) }

// COL.1 - CODIGO PRODUCTO
   WITH OBJECT oBrw:aCols[1]
      :bStrData := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                            aItems[oBrw:nArrayAt, 1] ) }
      :cEditPicture := "@X"
        :nEditType    := EDIT_GET_BUTTON // EDIT_GET // EDIT_GET_LISTBOX
      :bEditBlock   := { || alert("Llamar maestro de Inventario") } // VALID BUTTON EN GET
        :bEditValid   := { | oGet, oCol | IF( !novacio( oGet:value ) , .f. ,;
                                            buscacodigo( oGet, oCol, oBrw ) ) } // VALIDA ANTES DE PERDER FOCUS
        :bOnPostEdit  := { | oCol, xVal, nKey | IF( nKey <> VK_ESCAPE ,; // DESPUES DE LA EDICION
                                                ( oCol:value := xVal ,;
                       aItems[oBrw:nArrayAt, 2] := "DESCRIPCION DEL PRODUCTO" ,;
                       oBrw:SelectCol( 4 ) ), ) } // MUEVO PUNTERO A COL(n)
      :bEditWhen     := {|| LEN( oBrw:aArrayData ) > 0 } // REVISAR ESTO....DA ERROR DE RANGO ARRAY....
      :bLClickHeader := { || alert("pulsaste boton izq.sobre cabecera col.") }
      :cToolTip := "usando ToolTips..."
   END WITH

// COL.2 - NOMBRE/DESCRIPCION
   WITH OBJECT oBrw:aCols[2]
      :bStrData := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                            aItems[oBrw:nArrayAt, 2] ) }
      :nEditType      := EDIT_BUTTON // EDIT_GET // EDIT_GET_LISTBOX
   END WITH

// COL.3 - UNIDAD
   WITH OBJECT oBrw:aCols[3]
      :bStrData      := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                           aItems[oBrw:nArrayAt, 3] ) }
      :cFooter       := "ITEMS =>"
      :nFootStrAlign := AL_RIGHT // ALINEA DATA FOOTER
        :nEditType     := EDIT_LISTBOX
      :aEditListTxt  := { "UNIDAD", "AGRU1", "AGRU2" }
      :bEditWhen     := {|| IF( EMPTY( aItems[oBrw:nArrayAt, 1] ), .f., .t. ) }
        :bOnPostEdit   := { | oCol, xVal, nKey | If( nKey <> VK_ESCAPE ,;
                                         ( oCol:value:= xVal, alert(xVal) ), ) }
   END WITH

// COL.4 - CANTIDAD
   WITH OBJECT oBrw:aCols[4]
      :bStrData      := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                                 aItems[oBrw:nArrayAt, 4] ) }
      :cEditPicture  := "@E 9,999,999"
      :nFootStrAlign := AL_RIGHT // ALINEA DATA FOOTER
      :lTotal        := .t. // PARA TOTALIZAR COL.
      :nTotal        := 0 // PARA TOTALIZAR COL.
      :nFooterType   := AGGR_SUM // PARA TOTALIZAR COL.
        :nEditType     := EDIT_GET
      :bEditValid    := { | oGet, oCol | mayorqcero( oGet:value() ) }
        :bOnPostEdit   := { | oCol, xVal, nKey | If( nKey <> VK_ESCAPE ,;
                                                 ( oCol:value := xVal ) , ) }
      :bEditWhen     := {|| !EMPTY( aItems[oBrw:nArrayAt, 1] ) }
   END WITH

// COL.5 - PVP
   WITH OBJECT oBrw:aCols[5]
      :bStrData      := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                                 aItems[oBrw:nArrayAt, 5] ) }
      :cEditPicture  := "@E 9,999,999.99"
      :nFootStrAlign := AL_RIGHT
        :nEditType     := EDIT_GET_BUTTON
      :bEditBlock   := { || alert("Seleccionar Varios Precios...") }
      :bEditValid    := { | oGet, oCol | mayorqcero( oGet:value() ) }
        :bOnPostEdit   := { | oCol, xVal, nKey | If( nKey <> VK_ESCAPE ,;
                                                 ( oCol:value := xVal ,;
                                                   totalinea( oBrw, aVar, aGet ) ), ) }
      :bEditWhen     := {|| !EMPTY( aItems[oBrw:nArrayAt, 1] ) }
   END WITH

// COL.6 - % DESCUENTO
   WITH OBJECT oBrw:aCols[6]
      :bStrData     := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                                 aItems[oBrw:nArrayAt, 6] ) }
      :cFooter      := "SUB-TOTAL=>"
      :cEditPicture := "@E 999.99 %"
        :nEditType    := EDIT_GET
      :bEditValid   := { | oGet, oCol | IF( menorqcero( oGet:value() ) ,;
                                          menorqcien( oGet:value() ), .f. ) }
        :bOnPostEdit   := { | oCol, xVal, nKey | If( nKey <> VK_ESCAPE ,;
                                                 ( oCol:value := xVal ,;
                                                   totalinea( oBrw, aVar, aGet ) ,;
                                                   addrow( oBrw ) ) , ) }
      :bEditWhen    := {|| !EMPTY( aItems[oBrw:nArrayAt, 1] ) .and. ;
                           aItems[oBrw:nArrayAt, 5] > 0 }
   END WITH

// COL.7 - TOTAL LINEA
   WITH OBJECT oBrw:aCols[7]
      :bStrData      := {|| IIF( LEN( aItems ) = 0, SPACE(10) ,;
                                 aItems[oBrw:nArrayAt, 7] ) }
      :cEditPicture  := "@E9,999,999.99"
      :nFootStrAlign := AL_RIGHT // ALINEA DATA FOOTER
      :lTotal        := .t. // PARA TOTALIZAR COL.
      :nTotal        := 0 // PARA TOTALIZAR COL.
      :nFooterType   := AGGR_SUM   // PARA TOTALIZAR COL.
      :cToolTip := "Columna 7"
   END WITH

   oBrw:MakeTotals()
   oBrw:Refresh()

// DATOS CLIENTE
   REDEFINE GET aGet[1] VAR aVar[1] ID 101 OF oDlg PICTURE "@!" UPDATE ; // COD.CLIENTE
      ACTION ( oQBtn := llamabrow( oQryCli, aVar[1], {"cli_codigo", "cli_nombre"} ,;
                                   {"Código", "Nombre"} ) ,;
               IIF( !oQBtn[1] ,;
                  ( alert("DEBE SELECCIONAR CLIENTE o ZERO PARA CLIENTE VARIOS...") ,;
                    aVar[2] := nil, aGet[2]:REFRESH(), .f. ) ,;
                  ( aVar[1] := oQBtn[2]:cli_codigo, aGet[1]:REFRESH() ,;
                    aVar[2] := oQBtn[2]:cli_nombre, aGet[2]:REFRESH() ,;
                    aGet[3]:SetFocus(), .t. ) ) ) ;
      VALID ( IIF( oQryCli:Seek( aVar[1], "cli_codigo" ) == 0 ,;
                 ( oQBtn := llamabrow( oQryCli, aVar[1], {"cli_codigo", "cli_nombre"} ,;
                                       {"Código", "Nombre"} ) ,;
                 ( IIF( !oQBtn[1] ,;
                      ( alert("DEBE SELECCIONAR CLIENTE o ZERO PARA CLIENTE VARIOS...") ,;
                        aVar[2] := nil, aGet[2]:REFRESH(), .f. ) ,;
                      ( aVar[1] := oQBtn[2]:cli_codigo, aGet[1]:REFRESH() ,;
                        aVar[2] := oQBtn[2]:cli_nombre, aGet[2]:REFRESH(), .t. ) ) ) ) ,;
                 ( alert("ENTRO VALOR QUE EXISTE") ,;
                   aVar[1] := oQryCli:cli_codigo, aGet[1]:REFRESH() ,;
                   aVar[2] := oQryCli:cli_nombre, aGet[2]:REFRESH(), .t. ) ) )

   REDEFINE GET aGet[2] VAR aVar[2] ID 102 OF oDlg UPDATE READONLY // NOMB.CLIENTE

   REDEFINE GET aGet[3] VAR aVar[3] ID 103 OF oDlg PICTURE "@!" UPDATE ; // COD.VENDEDOR
      ACTION ( oQBtn := llamabrow( oQryVen, aVar[3], {"ven_codigo", "ven_nombres"} ,;
                                   {"Código", "Nombre"} ) ,;
               IIF( !oQBtn[1] ,;
                  ( alert("DEBE SELECCIONAR VENDEDOR...") ,;
                    aVar[4] := nil, aGet[4]:REFRESH(), .f. ) ,;
                  ( aVar[3] := oQBtn[2]:ven_codigo, aGet[3]:REFRESH() ,;
                    aVar[4] := ALLTRIM( oQBtn[2]:ven_nombres ) + " " + ;
                               ALLTRIM( oQBtn[2]:ven_apellidos ) ,;
                    aGet[4]:REFRESH() ,;
                    aGet[5]:SetFocus(), .t. ) ) ) ;
      VALID ( IIF( oQryVen:Seek( aVar[3], "ven_codigo" ) == 0 ,;
                 ( oQBtn := llamabrow( oQryVen, aVar[3], {"ven_codigo", "ven_nombres"} ,;
                                       {"Código", "Nombre"} ) ,;
                 ( IIF( !oQBtn[1] ,;
                      ( alert("DEBE SELECCIONAR VENDEDOR...") ,;
                        aVar[4] := nil, aGet[4]:REFRESH(), .f. ) ,;
                      ( aVar[3] := oQBtn[2]:ven_codigo, aGet[3]:REFRESH() ,;
                        aVar[4] := ALLTRIM( oQBtn[2]:ven_nombres ) + " " + ;
                                   ALLTRIM( oQBtn[2]:ven_apellidos ) ,;
                        aGet[4]:REFRESH(), .t. ) ) ) ) ,;
                 ( alert("ENTRO VALOR QUE EXISTE") ,;
                   aVar[3] := oQryVen:ven_codigo, aGet[3]:REFRESH() ,;
                   aVar[4] := oQryVen:ven_nombres, aGet[4]:REFRESH(), .t. ) ) )

   REDEFINE GET aGet[4] VAR aVar[4] ID 104 OF oDlg UPDATE READONLY // NOMB.VENDEDOR

   REDEFINE GET aGet[5] VAR aVar[5] ID 105 OF oDlg PICTURE "@!" UPDATE ; // COD.TRANS.
      ACTION ( oQBtn := llamabrow( oQryTrn, aVar[5], {"trn_codigo", "trn_nombre"} ,;
                                   {"Código", "Nombre"} ) ,;
               IIF( !oQBtn[1] ,;
                  ( alert("DEBE SELECCIONAR TRANSPORTE...") ,;
                    aVar[6] := nil, aGet[6]:REFRESH(), .f. ) ,;
                  ( aVar[5] := oQBtn[2]:trn_codigo, aGet[5]:REFRESH() ,;
                    aVar[6] := oQBtn[2]:trn_nombre, aGet[6]:REFRESH() ,;
                    aGet[7]:SetFocus(), .t. ) ) ) ;
      VALID ( IIF( oQryTrn:Seek( aVar[5], "trn_codigo" ) == 0 ,;
                 ( oQBtn := llamabrow( oQryTrn, aVar[5], {"trn_codigo", "trn_nombre"} ,;
                                       {"Código", "Nombre"} ) ,;
                 ( IIF( !oQBtn[1] ,;
                      ( alert("DEBE SELECCIONAR TRANSPORTE...") ,;
                        aVar[6] := nil, aGet[6]:REFRESH(), .f. ) ,;
                      ( aVar[5] := oQBtn[2]:trn_codigo, aGet[5]:REFRESH() ,;
                        aVar[6] := oQBtn[2]:trn_nombre, aGet[6]:REFRESH(), .t. ) ) ) ) ,;
                 ( alert("ENTRO VALOR QUE EXISTE") ,;
                   aVar[5] := oQryTrn:trn_codigo, aGet[5]:REFRESH() ,;
                   aVar[6] := oQryTrn:trn_nombre, aGet[6]:REFRESH(), .t. ) ) )

   REDEFINE GET aGet[6] VAR aVar[6] ID 106 OF oDlg UPDATE READONLY // NOMB.TRANS.

   REDEFINE GET aGet[7] VAR aVar[7] MEMO ID 107 OF oDlg MULTILINE // COMENTARIOS

   REDEFINE COMBOBOX aGet[8] VAR aVar[8] ITEMS aCondi ID 108 OF oDlg UPDATE // CONDICIONES

   REDEFINE GET aGet[9] VAR aVar[9] ID 109 OF oDlg PICTURE "@E 9,999" UPDATE ; // DIAS PLAZO
      VALID( menorqcero( aVar[9] ) ) ;
      WHEN ( aVar[8] == 2 )

   REDEFINE COMBOBOX aGet[10] VAR aVar[10] ITEMS aStatus ID 110 OF oDlg UPDATE // STATUS

   REDEFINE DTPICKER aGet[11] VAR aVar[11] ID 111 OF oDlg UPDATE ; // FCH.FACT.
      VALID( IIF( !validfecha( aVar[11] ), .f. ,;
                ( aVar[12] := aVar[11] + aVar[9], aGet[12]:REFRESH(), .t. ) ) )

   REDEFINE GET aGet[12] VAR aVar[12] ID 112 OF oDlg UPDATE READONLY // FCH.VENCE

   REDEFINE GET aGet[13] VAR aVar[13] ID 113 OF oDlg PICTURE "9999999999" UPDATE ; // NUM.CONTROL
      VALID( IIF( !mayorqcero( aVar[13] ), .f., ( aVar[13] := STRZERO( aVar[13], 10 ) ,;
                               aGet[13]:REFRESH() ,;
                               addrow( oBrw ), .t. ) ) )

   REDEFINE GET aGet[14] VAR aVar[14] ID 114 OF oDlg PICTURE "9999999999" UPDATE ; // NUM.FACTURA
      READONLY

// DESC. IVA Y TOTALES FACTURA
// DESCUENTOS
   REDEFINE GET aGet[15] VAR aVar[15] ID 115 OF oDlg PICTURE "@E 999.99" UPDATE ; // % DESC.SOBRE MTO.BRUTO
      VALID( IIF( aVar[15] >= 0, netopagar( aVar[18], aVar, aGet ), .t. ) )

   REDEFINE GET aGet[16] VAR aVar[16] ID 116 OF oDlg PICTURE "@E 9,999,999.99" UPDATE ; // MTO.DESC.SOBRE MTO.BRUTO
      VALID( IIF( aVar[16] >= 0, netopagar( aVar[18], aVar, aGet ), .t. ) )
// IVA
   REDEFINE GET aGet[17] VAR aVar[17] ID 117 OF oDlg PICTURE "@E 999.99" // % IVA
// TOTALES
   REDEFINE GET aGet[18] VAR aVar[18] ID 118 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.SIN IVA
   REDEFINE GET aGet[19] VAR aVar[19] ID 119 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.DESC.
   REDEFINE GET aGet[20] VAR aVar[20] ID 120 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.IVA
   REDEFINE GET aGet[21] VAR aVar[21] ID 121 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.NETO PAGAR
   REDEFINE GET aGet[22] VAR aVar[22] ID 122 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.SIN IVA - MTO.DESC.
   REDEFINE GET aGet[23] VAR aVar[23] ID 123 OF oDlg PICTURE "@E 9,999,999.99" UPDATE // MTO.EXENTO(no paga imp.)

// BOTONES CUERPO FACTURA
   REDEFINE BUTTONBMP aBtn[1] ID 201 OF oDlg UPDATE ; // INC.REG.
      ACTION ( addrow( oBrw ) ) ;
      BITMAP "incluir32" PROMPT "Incluir" + CRLF + "[F2]"

   REDEFINE BUTTONBMP aBtn[2] ID 202 OF oDlg ; // MOD.REG.
      ACTION ( alert("en construccion...") ) ;//ACTION ( modrow( oBrw ) ) ;
      BITMAP "modificar32" PROMPT "Modificar" + CRLF + "[F3]" ;
      WHEN ( LEN( oBrw:aArrayData ) > 0 ) UPDATE

   REDEFINE BUTTONBMP aBtn[3] ID 203 OF oDlg ; // ELI.REG.
      ACTION ( delrow( oBrw, aVar, aGet ) ) ;
      BITMAP "eliminar32" PROMPT "E&liminar" + CRLF + "[F4]" ;
      WHEN ( LEN( oBrw:aArrayData ) > 0 ) UPDATE

   REDEFINE BUTTONBMP aBtn[4] ID 204 OF oDlg ; // BUSCAR REG.
      ACTION ( alert("buscar reg.") ) ;
      BITMAP "buscar32" PROMPT "B&uscar" + CRLF + "[F5]" ;
      WHEN ( LEN( oBrw:aArrayData ) > 0 ) UPDATE

   REDEFINE BUTTONBMP aBtn[5] ID 205 OF oDlg UPDATE ; // CANCELAR FACT.
      ACTION ( oDlg:END() ) ;
      BITMAP "Cancelar32" PROMPT "Cancelar" + CRLF + "[F6]"

   REDEFINE BUTTONBMP aBtn[6] ID 206 OF oDlg UPDATE ; // FINALIZAR FACT.
      ACTION ( alert("Fin Factura"), grabafactu( .t., .t., aVar, oBrw ), oDlg:END() ) ;
      BITMAP "finalizar32" PROMPT "&Finalizar" + CRLF + "[F7]" ;//WHEN ( aVar[21] > 0 )

   REDEFINE BUTTONBMP aBtn[7] ID 207 OF oDlg ; // IMP.RENGLONES
      ACTION ( alert("Importar renglon desde...") ) ;
      BITMAP "importar32" PROMPT "&Importar" + CRLF + "[F12]" ;
      WHEN ( LEN( oBrw:aArrayData ) > 0 ) UPDATE

   aBtn[5]:lCancel := .t.

// FIN BOTONES CUERPO FACTURA

   ACTIVATE DIALOG oDlg CENTER

   oQryCli:END(); oQryVen:END(); oQryTrn:END()

RETURN ( .t. )

STATIC FUNCTION buscacodigo( oGet, oCol, oBrw ) // BUSCO CODIGO
*   ? "busco codigo..."
RETURN ( .t. )

STATIC FUNCTION addrow( oBrw ) // ADICIONO REGISTRO

   IF LEN( oBrw:aArrayData ) > 0
      oBrw:GoBottom()

      IF oBrw:aArrayData[ oBrw:nArrayAt, 7] > 0
         AADD( oBrw:aArrayData ,;
             { , , "UNIDAD", 0, 0, 0, 0 } )
      ENDIF
   ELSE
      AADD( oBrw:aArrayData ,;
          { , , "UNIDAD", 0, 0, 0, 0 } )
   ENDIF

   oBrw:SetPos( , 1, ) // MUEVE PUNTO A COL.1
   oBrw:GoBottom()
   oBrw:Refresh()
   oBrw:SetFocus()

RETURN nil

STATIC FUNCTION modirow( oBrw ) // MODIFICAR REGISTRO

   oBrw:SetPos( , 1, ) // MUEVE PUNTO A COL.1
   oBrw:Refresh()
   oBrw:SetFocus()

RETURN nil

STATIC FUNCTION totalinea( oBrw, aVar, aGet ) // TOTAL POR RENGLON CON Y SIN DESC.
// TOTAL = CANTIDAD * PRECIO
   oBrw:aArrayData[oBrw:nArrayAt, 7] := ;
       ( oBrw:aArrayData[oBrw:nArrayAt, 4] * oBrw:aArrayData[oBrw:nArrayAt, 5] )

// TOTAL = TOTAL - MTO.DESCUENTO
   oBrw:aArrayData[oBrw:nArrayAt, 7] := ;
       oBrw:aArrayData[oBrw:nArrayAt, 7] - ;
       ( oBrw:aArrayData[oBrw:nArrayAt, 7] * oBrw:aArrayData[oBrw:nArrayAt, 6] / 100 )

   oBrw:MakeTotals(); oBrw:Refresh()
   netopagar( oBrw:aCols[7]:nTotal, aVar, aGet ) // CALCULA NETO PAGAR

RETURN nil

STATIC FUNCTION netopagar( nSTotal, aVar, aGet ) // CALCULA NETO PAGAR

   LOCAL nFor := 0

   aVar[18] := nSTotal // MTO.SIN IVA NI DESCUENTO
   aVar[19] := aVar[16] + ( aVar[18] * aVar[15] ) / 100 // MTO.DESCUENTO GENERAL
   aVar[22] := aVar[18] - aVar[19]
   aVar[20] := ( ( ( aVar[18]-aVar[19] ) * aVar[17] ) / 100 ) // MTO.IVA SEGUN TASA ACTIVA
   aVar[21] := ( aVar[18] - aVar[19] ) + aVar[20]

   FOR nFor := 18 TO 22
      aGet[nFor]:REFRESH()
   NEXT

RETURN ( .t. )

STATIC FUNCTION delrow( oBrw, aVar, aGet ) // ELIMINO REGISTRO

   IF LEN( oBrw:aArrayData ) == 0
      MSGINFO( "No hay Registro(s) para Eliminar...", oDatos:cTitMsg )
      RETURN nil
   ENDIF

   IF MSGNOYES( "Seguro Desea ELIMINAR el Registro: " + ;
      ALLTRIM( cValToChar( oBrw:aArrayData[oBrw:nArrayAt, 1] ) ) + " ?", oDatos:cTitMsg )
      IF oBrw:nLen > 0
         ADEL( oBrw:aArrayData, oBrw:nArrayAt )
         ASIZE( oBrw:aArrayData, oBrw:nLen - 1 )
      ENDIF
   ENDIF

   oBrw:GOTOP()
   oBrw:SetFocus()
   oBrw:MakeTotals()
   oBrw:Refresh()

   netopagar( oBrw:aCols[7]:nTotal, aVar, aGet ) // CALCULA NETO PAGAR

RETURN nil

FUNCTION grabafactu( lNew, lTipoVta, aVar, oBrwMFV ) // GRABO FACTURA Y CUERPO FACTURA
// lNew -> FACTURA NUEVA/MODIFICADA
// lTipoVta -> CONTROLA TIPO VTA. FACT.VTA.CON PRODUCTOS(.t.) / DOCUMENTO(.f.)
// aVar -> DATOS CABEZERA Y TOTALES DE FV.
// oBrwMFV -> MAESTRO DE FV.

   LOCAL cQryFV, cQryMFV, cQryCNF, oError ,;
         nFor := 0, nFactura := 0

   IF aVar[21] == 0 // SI POR ALGUN MOTIVO LLEGA SIN MONTO
      alert("factura sin mto.neto...")
      RETURN .t.
   ENDIF

   oDatos:oQryCnf:REFRESH() // REFRESCO TABLA config, QUERY PUBLICO
   nFactura := oDatos:oQryCnf:num_factura
   nFactura := nFactura + 1 // DEBO HACER nFac = AL No.MAS ALTO EN config + 1

   IF oDatos:oQryCnf:LastRec() = 0 // VERIFICO SI TABLA ESTA VACIA
      cQryCNF := "INSERT INTO config SET num_factura = ' " + ClipValue2SQL( nFactura ) + "'"
   ELSE
      cQryCNF := "UPDATE config SET num_factura = ' " + ClipValue2SQL( nFactura ) + "'"
   ENDIF

   TRY
      oDatos:oConex:Execute( cQryCNF )
   CATCH oError
      MSGSTOP( oError:Description + CRLF + "Error Grabando en Tabla (config), Sentencia" + ;
               CRLF + CRLF + cQryCNF, oDatos:cTitMsg )
   END

   oDatos:oQryCnf:REFRESH()

   aVar[14] := nFactura // ACTUALIZO NUM.FACT.PARA GRABAR EN facturas

// GRABO FACTURA
   IF lNew
      cQryFV := "INSERT INTO facturas SET "
      cQryFV += "fac_numfac=" + ClipValue2SQL( aVar[14] ) + ","
   ELSE
      cQryFV := "UPDATE facturas SET "
   ENDIF

   cQryFV += "fac_codicli="     + ClipValue2SQL( aVar[1] ) + ","
   cQryFV += "fac_nombcli="     + ClipValue2SQL( aVar[2] ) + ","
   cQryFV += "fac_codiven="     + ClipValue2SQL( aVar[3] ) + ","
   cQryFV += "fac_nombven="     + ClipValue2SQL( aVar[4] ) + ","
   cQryFV += "fac_coditrans="   + ClipValue2SQL( aVar[5] ) + ","
   cQryFV += "fac_nombtrans="   + ClipValue2SQL( aVar[6] ) + ","
   cQryFV += "fac_comentarios=" + ClipValue2SQL( Val2Escape( aVar[7] ) ) + ","
   cQryFV += "fac_condiciones=" + ClipValue2SQL( aVar[8] ) + ","
   cQryFV += "fac_diasplazo="   + ClipValue2SQL( aVar[9] ) + ","
   cQryFV += "fac_status="      + ClipValue2SQL( aVar[10] ) + ","
   cQryFV += "fac_fchfac="      + ClipValue2SQL( aVar[11] ) + ","
   cQryFV += "fac_fchvence="    + ClipValue2SQL( aVar[12] ) + ","
   cQryFV += "fac_numctrl="     + ClipValue2SQL( aVar[13] ) + ","
//
   cQryFV += "fac_pordesc="     + ClipValue2SQL( aVar[15] ) + ","
   cQryFV += "fac_mtodesc="     + ClipValue2SQL( aVar[16] ) + ","
   cQryFV += "fac_poriva="      + ClipValue2SQL( aVar[17] ) + ","
   cQryFV += "fac_mtototal="    + ClipValue2SQL( aVar[18] ) + ","
   cQryFV += "fac_totdesc="     + ClipValue2SQL( aVar[19] ) + ","
   cQryFV += "fac_mtosobre="    + ClipValue2SQL( aVar[22] ) + ","
   cQryFV += "fac_mtoiva="      + ClipValue2SQL( aVar[20] ) + ","
   cQryFV += "fac_mtoexento="   + ClipValue2SQL( aVar[23] ) + ","
   cQryFV += "fac_neto="        + ClipValue2SQL( aVar[21] ) + ","
   cQryFV += "usuario="         + ClipValue2SQL( Val2Escape( "JL" ) ) + ","
   cQryFV += "fchcrea="         + ClipValue2SQL( DATE() )


   TRY // GRABO EN LA TABLA...
      oDatos:oConex:Execute( cQryFV )
   CATCH oError
      MSGSTOP( oError:Description + CRLF + "Error Grabando en Tabla (factura), Sentencia" + ;
               CRLF + CRLF + cQryFV, oDatos:cTitMsg )
   END
// FIN GRABO DATOS FACTURA / DOCUMENTO

return .t.

   IF !lTipoVta // VTA.DOCUMENTO
      RETURN .t.
   ENDIF

// GRABO CUERPO FACTURA
   IF lNew // SIEMPE ES NUEVA, SI SE USA MODIFICAR FV SE CAMBIARA
      FOR nFor := 1 TO LEN( oBrwMFV:aArrayData )
         cQryMFV := "INSERT INTO movi_facturas SET "
         cQryMFV += "cod_producto=" + ClipValue2SQL( oBrwMFV:aArrayData[nFor,1] ) + ","
         cQryMFV += "nom_producto=" + ClipValue2SQL( oBrwMFV:aArrayData[nFor,2] ) + ","
         cQryMFV += "cantidad=" + ClipValue2SQL( oBrwMFV:aArrayData[nFor,3] ) + ","
         cQryMFV += "pvp=" + ClipValue2SQL( oBrwMFV:aArrayData[nFor,4] ) + ","
         cQryMFV += "stotal=" + ClipValue2SQL( oBrwMFV:aArrayData[nFor,5] ) + ","
         cQryMFV += "poriva=" + ClipValue2SQL( oDatos:oQryCnf:por_iva ) + ","
         //
         cQryMFV += "cedula=" + ClipValue2SQL( Val2Escape( aVar[1] ) ) + ","
         cQryMFV += "num_inscripcion=" + ClipValue2SQL( aVar[2] ) + ","
         cQryMFV += "num_factura=" + ClipValue2SQL( aVar[4] ) + ","
         cQryMFV += "fch_movimiento=" + ClipValue2SQL( aVar[3] ) + ","
         cQryMFV += "cod_asesor=" + ClipValue2SQL( Val2Escape( aVar[11] ) ) + ","
         cQryMFV += "nom_asesor=" + ClipValue2SQL( Val2Escape( aVar[12] ) ) + ","
         cQryMFV += "grupo=" + ClipValue2SQL( Val2Escape( aVar[14] ) ) + ","
         //
         cQryMFV += "usuario=" + ClipValue2SQL( 00 ) + ","
         cQryMFV += "fchcrea="    + ClipValue2SQL( DATE() ) //+ ","

         TRY // GRABO EN LA TABLA...
            oDatos:oConex:Execute( cQryMFV )
         CATCH oError
            MSGSTOP( oError:Description + CRLF + "Error Grabando en Tabla (movi_facturas), Sentencia" + ;
                     CRLF + CRLF + cQryMFV, oDatos:cTitMsg )
         END
      NEXT
   ENDIF
// FIN GRABO CUERPO FACTURA

RETURN .t. //( aVar )

STATIC FUNCTION teclado( nKey, oBrw, aVar, aGet ) // CONTROLA TECLA PRESIONADA CUANDO xBRW TIENE FOCUS

   DO CASE
      CASE nKey == VK_DELETE .or. nKey == VK_F4 // ELIMINAR REGISTRO(Supr/F4)
           delrow( oBrw, aVar, aGet )

      CASE nKey == VK_F2 // ADICIONA REGISTRO CON TECLA DE FUNCION...
           addrow( oBrw )

      CASE nKey == VK_F3 // MODIFICAR REGISTRO CON TECLA DE FUNCION...
           modirow( oBrw )

      CASE nKey == VK_F7
           alert("F7...")
           grabafactu( .t., .t., aVar, oBrw )

      CASE nKey == VK_F12
           alert("pulso F12")

      CASE nKey == VK_F11
           alert("pulso F11")

      CASE nKey == VK_F10     // NO FUNCIONA
           alert("pulso F10")

      CASE nKey == VK_F9
           alert("pulso F9")

      CASE nKey == VK_F8
           alert("pulso F8")

      CASE nKey == VK_F6
           alert("pulso F6")

      CASE nKey == VK_F5
           alert("pulso F5")

      CASE nKey == VK_INSERT
           alert("insertar Reg.")

      CASE nKey == VK_DOWN
           alert("pa´bajo")

      CASE nKey == VK_UP
           alert("pa´rriba")

   END CASE

RETURN nil
 


Buenos dias gracias mi estimado Jose Luis,no conozco esos comandos me parece como de sql,y es parecido a lo que pueda adaptar a mi base de datos dbf?

solo quiero controlar numero de folio y fecha desde encabezado y de ahi agregar nuevos registros a mi browse que vaya alimentando informacion y con los botones de nuevo registro, modificar registro y eliminar, estudiare su codigo y aplicarlo a mi sistema .

Gracias y saludos Jose Luis
Rosa
Rosita
 
Posts: 53
Joined: Tue Aug 18, 2015 7:34 pm

Re: Ejemplo sencillo de factura

Postby joseluisysturiz » Wed Apr 13, 2016 3:54 pm

Buen dia Rosa, estas en lo cierto, como te dije en mi primer comentario uso es MYSQL, pero la logica de trabajo es la misma, solo debes usar tus comando para DBF, alli controlo numero de documento, busqueda de cliente y el AME de los items a facturar Agregar, Modificar, Eliminar(AME), espero te sirva de incio y cualquier duda, estoy a la orden...saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Ejemplo sencillo de factura

Postby Rosita » Wed Apr 13, 2016 5:01 pm

joseluisysturiz wrote:Buen dia Rosa, estas en lo cierto, como te dije en mi primer comentario uso es MYSQL, pero la logica de trabajo es la misma, solo debes usar tus comando para DBF, alli controlo numero de documento, busqueda de cliente y el AME de los items a facturar Agregar, Modificar, Eliminar(AME), espero te sirva de incio y cualquier duda, estoy a la orden...saludos... :shock:



Gracias mi estimado Jose Luis,voy lenta entendiendo tu codigo fuente y escribirlo en una hoja de trabajo para entenderlo mas claro que debo o que no debo hacer en el boton de agregar no veo la logica de si es nuevo registro que la logica sea asi

if agrenuevo registro si es verdadero o falso
append()
endif

pero si es modificar desde donde o como ejecutar si es falso desde browse al darle enter o desde botones de modificar registro en eliminar espero no sea problema mi duda son esos dos botones como seria su comportamiento agregar y modificar,algo medio confuso pero voy anotando en mi cuadernillo y transcribir en mi archivo prg.

gracias y saludos
su amiga Rosa
Rosita
 
Posts: 53
Joined: Tue Aug 18, 2015 7:34 pm

Re: Ejemplo sencillo de factura

Postby Rosita » Wed Apr 13, 2016 5:36 pm

Rosita wrote:
joseluisysturiz wrote:Buen dia Rosa, estas en lo cierto, como te dije en mi primer comentario uso es MYSQL, pero la logica de trabajo es la misma, solo debes usar tus comando para DBF, alli controlo numero de documento, busqueda de cliente y el AME de los items a facturar Agregar, Modificar, Eliminar(AME), espero te sirva de incio y cualquier duda, estoy a la orden...saludos... :shock:



Gracias mi estimado Jose Luis,voy lenta entendiendo tu codigo fuente y escribirlo en una hoja de trabajo para entenderlo mas claro que debo o que no debo hacer en el boton de agregar no veo la logica de si es nuevo registro que la logica sea asi

if agrenuevo registro si es verdadero o falso
append()
endif

pero si es modificar desde donde o como ejecutar si es falso desde browse al darle enter o desde botones de modificar registro en eliminar espero no sea problema mi duda son esos dos botones como seria su comportamiento agregar y modificar,algo medio confuso pero voy anotando en mi cuadernillo y transcribir en mi archivo prg.
Que programa me recomiendan para crear mi pantalla de recursos como el que tienes Jose Luis

gracias y saludos
su amiga Rosa
Rosita
 
Posts: 53
Joined: Tue Aug 18, 2015 7:34 pm

Re: Ejemplo sencillo de factura

Postby Rosita » Wed Apr 13, 2016 6:14 pm

Rosita wrote:
Rosita wrote:
joseluisysturiz wrote:Buen dia Rosa, estas en lo cierto, como te dije en mi primer comentario uso es MYSQL, pero la logica de trabajo es la misma, solo debes usar tus comando para DBF, alli controlo numero de documento, busqueda de cliente y el AME de los items a facturar Agregar, Modificar, Eliminar(AME), espero te sirva de incio y cualquier duda, estoy a la orden...saludos... :shock:



Gracias mi estimado Jose Luis,voy lenta entendiendo tu codigo fuente y escribirlo en una hoja de trabajo para entenderlo mas claro que debo o que no debo hacer en el boton de agregar no veo la logica de si es nuevo registro que la logica sea asi

if agrenuevo registro si es verdadero o falso
append()
endif

pero si es modificar desde donde o como ejecutar si es falso desde browse al darle enter o desde botones de modificar registro en eliminar espero no sea problema mi duda son esos dos botones como seria su comportamiento agregar y modificar,algo medio confuso pero voy anotando en mi cuadernillo y transcribir en mi archivo prg.
Que programa me recomiendan para crear mi pantalla de recursos como el que tienes Jose Luis

gracias y saludos
su amiga Rosa


Que programa me recomiendan para crear mi pantalla de recursos como el que tienes Jose Luis
jajajaja mi estimado Jose Luis aun no me queda claroo, por lo que entiendo agregas tus registros pero a modo de edicion del browser amigo???
Dos a mi modo de editar desde boton de agregar registros puedo llamar a un dialogo y editar los campos de detalle a capturar y agregarme en mi browser o no se puede y a fuerza tiene que ser desde modo edicion de browse o como seria desde dialogo de detalle a editar mis campsos y luego grabarlo mi registros estyoy algo confundida :cry: :cry: por favor echenle la mano :oops:

gracias saludos
Rosa
Rosita
 
Posts: 53
Joined: Tue Aug 18, 2015 7:34 pm

Re: Ejemplo sencillo de factura

Postby joseluisysturiz » Thu Apr 14, 2016 2:04 am

Rosa, uso el editor de recurso PELLES C que es totalmente gratuito como muchos otro y muy facil de manejar.
En relacion al manejo de los registros puedes usar varias formas:
- edicion directa en el xbrose, para mi lamas comoda, rapida y menos codigo
- llamando un dialogo donde solicites y modifiques los registros, codigo, monto, precio, etc.
- creando encima del xbrowse GET con codigo, nombre, cantidad, precio, etc...para evitar el llamado de otro DLG

dime cual te parec mejor y te doy un sample de diseño, saludos... :shock:

skype: joseluisy
joseluisysturiz@yahoo.com
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Ejemplo sencillo de factura

Postby joseluisysturiz » Thu Apr 14, 2016 2:21 am

Rosita wrote:
joseluisysturiz wrote:Buen dia Rosa, estas en lo cierto, como te dije en mi primer comentario uso es MYSQL, pero la logica de trabajo es la misma, solo debes usar tus comando para DBF, alli controlo numero de documento, busqueda de cliente y el AME de los items a facturar Agregar, Modificar, Eliminar(AME), espero te sirva de incio y cualquier duda, estoy a la orden...saludos... :shock:



Gracias mi estimado Jose Luis,voy lenta entendiendo tu codigo fuente y escribirlo en una hoja de trabajo para entenderlo mas claro que debo o que no debo hacer en el boton de agregar no veo la logica de si es nuevo registro que la logica sea asi

if agrenuevo registro si es verdadero o falso
append()
endif

pero si es modificar desde donde o como ejecutar si es falso desde browse al darle enter o desde botones de modificar registro en eliminar espero no sea problema mi duda son esos dos botones como seria su comportamiento agregar y modificar,algo medio confuso pero voy anotando en mi cuadernillo y transcribir en mi archivo prg.

gracias y saludos
su amiga Rosa

Tratare explicarte de la manera mas sencilla q es lo q hago en AGREGAR/MODIFICAR, en mi caso como hago la edicion directa en el xbrowse hago todo el trabajo en un array y no hay gran cosa q hacer y para mi es mas facil...si usas un DLG editando el registro, cuando agregar digamos es facil, solo agregar un registro al array usando AADD(), cuando modificas un registro, entonces lees los datos del xbrowse y los llevas a los get, como el codigo del producto y nombre no deberian cambiar...esos campos los validas con un WHEN, alli es donde entra en juego los de una VAR logica, si es .t., es un registro nuevo y si es .f. entonces es una modificacion, el punto esta que si modificas algun valor del registro en modificacion, llamese cantidad o precio, entonces deberias eliminar del array el registro que editastes y luego agregas el mismo pero con los nuevos valores...espero no haberte confundido mas, o si algun otro colega tenga alguna explicacion o forma de hacerlo mas facil y/o comodo, sigo a la orden, saludos... :shock:

Post Data: de donde eres..? si no es imprudente la pregunta, gracias.
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Ejemplo sencillo de factura

Postby Rosita » Thu Apr 14, 2016 2:38 am

joseluisysturiz wrote:
Rosita wrote:
joseluisysturiz wrote:Buen dia Rosa, estas en lo cierto, como te dije en mi primer comentario uso es MYSQL, pero la logica de trabajo es la misma, solo debes usar tus comando para DBF, alli controlo numero de documento, busqueda de cliente y el AME de los items a facturar Agregar, Modificar, Eliminar(AME), espero te sirva de incio y cualquier duda, estoy a la orden...saludos... :shock:



Gracias mi estimado Jose Luis,voy lenta entendiendo tu codigo fuente y escribirlo en una hoja de trabajo para entenderlo mas claro que debo o que no debo hacer en el boton de agregar no veo la logica de si es nuevo registro que la logica sea asi

if agrenuevo registro si es verdadero o falso
append()
endif

pero si es modificar desde donde o como ejecutar si es falso desde browse al darle enter o desde botones de modificar registro en eliminar espero no sea problema mi duda son esos dos botones como seria su comportamiento agregar y modificar,algo medio confuso pero voy anotando en mi cuadernillo y transcribir en mi archivo prg.

gracias y saludos
su amiga Rosa

Tratare explicarte de la manera mas sencilla q es lo q hago en AGREGAR/MODIFICAR, en mi caso como hago la edicion directa en el xbrowse hago todo el trabajo en un array y no hay gran cosa q hacer y para mi es mas facil...si usas un DLG editando el registro, cuando agregar digamos es facil, solo agregar un registro al array usando AADD(), cuando modificas un registro, entonces lees los datos del xbrowse y los llevas a los get, como el codigo del producto y nombre no deberian cambiar...esos campos los validas con un WHEN, alli es donde entra en juego los de una VAR logica, si es .t., es un registro nuevo y si es .f. entonces es una modificacion, el punto esta que si modificas algun valor del registro en modificacion, llamese cantidad o precio, entonces deberias eliminar del array el registro que editastes y luego agregas el mismo pero con los nuevos valores...espero no haberte confundido mas, o si algun otro colega tenga alguna explicacion o forma de hacerlo mas facil y/o comodo, sigo a la orden, saludos... :shock:

Post Data: de donde eres..? si no es imprudente la pregunta, gracias.


Hola buenas noches muy amable en responder a mis dudas y inquietudes y por tu apreciable ayuda Jose Luis,he estado mirando en el foro y leo y releo que es facil codificar xbrowse con arrays pero como todavia soy muy nueva en este lenguaje aun no tengo la suficiente capacidad de crearlo aunque no parece dificil pero algo para entenderle el codigo a desarrollar y por ahora no quiero entrar a modo de edicion directa,solo necesito a modo de dialogo desde el boton de agregar nuevo registro y modificar registro al igual a modo de dialogo y no encontre nada parecido en el foro, solo edicion directa y con qry sql y no en dbf,ustedes ya tienen un buen abance y experiencias en sus proyectos,pero espero poder hacerlo a modo de dialogo y cual seria recomendadle con arras o directo en dbf y sus ventajas y desventajas y como se guardaria el contenido en un array son muchas cosas que aun no logro entenderle mas claro

gracias saludos
Rosa
Rosita
 
Posts: 53
Joined: Tue Aug 18, 2015 7:34 pm

Re: Ejemplo sencillo de factura

Postby joseluisysturiz » Thu Apr 14, 2016 6:07 pm

Aca te mando otra forma de como lo hago en otro sistema sin ser edicion directa en xbrowse...saludos.. :shock:

Code: Select all  Expand view  RUN


PROCEDURE factura()

// DEFINICION BROWSE
   oBrw := TXBrowse():New( oDlg )

   WITH OBJECT oBrw
      :nMarqueeStyle    := MARQSTYLE_HIGHLROW
      :nColDividerStyle := LINESTYLE_BLACK
      :lAllowColSwapping := .f.
      :lAllowColHiding := .f.
      :lColDividerComplete := .t.
      :nHeaderHeight := 30
      :l2007 := .t.
      :lFooter := .t.
      :lRecordSelector := .t.
      :bClrStd := {|| IF( oBrw:nArrayAt % 2 == 0, {CLR_BLACK, CLR_WHITE} ,;
         {0, RGB(203, 226, 254)} ) }
   END WITH
//
   oCol := oBrw:AddCol()
   oCol:cHeader       := "Código"
   oCol:nWidth        := 70
   oCol:bStrData      := {|| IIF( LEN( aProductos ) == 0, SPACE(10) ,;
                              aProductos[oBrw:nArrayAt, 1] ) }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_LEFT
   oCol:nArrayCol := 1
//
   oCol := oBrw:AddCol()
   oCol:cHeader       := "Descripción"
   oCol:nWidth        := 350
   oCol:bStrData      := {|| IIF( LEN( aProductos ) == 0, SPACE(10) ,;
                              aProductos[oBrw:nArrayAt, 2] ) }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_LEFT
   oCol:nArrayCol := 2
//
   oCol := oBrw:AddCol()
   oCol:cHeader       := "Cantidad"
   oCol:nWidth        := 50
   oCol:bStrData      := {|| IIF( LEN( aProductos ) == 0, SPACE(10) ,;
                              aProductos[oBrw:nArrayAt, 3] ) }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_RIGHT
   oCol:nArrayCol := 3
//
   oCol := oBrw:AddCol()
   oCol:cHeader       := "Precio Unitario"
   oCol:nWidth         := 100
   oCol:bStrData      := {|| IIF( LEN( aProductos ) == 0, SPACE(10) ,;
                              TRANSF( aProductos[oBrw:nArrayAt, 4], "@E999,999.99" ) ) }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_RIGHT
   oCol:nArrayCol := 4
//
   oCol := oBrw:AddCol()
   oCol:cHeader       := "Sub-Total"
   oCol:nWidth         := 100
   oCol:bStrData      := {|| IIF( LEN( aProductos ) == 0, SPACE(10) ,;
                              TRANSF( aProductos[oBrw:nArrayAt, 5], "@E999,999.99" ) ) }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_RIGHT
   oCol:nFooterType   := AGGR_SUM
   oCol:nFootStrAlign := AL_RIGHT
   oCol:cDataType     := "N"
   oCol:cEditPicture  := "@E 9,999,999.99"
   oCol:nArrayCol := 5
//
   oBrw:CreateFromResource( 100 )
   oBrw:SetArray( aProductos, .t. )

   oBrw:MakeTotals(); oBrw:RefreshFooters(); oBrw:REFRESH()
// FIN DEFINICION DEL xBROWSE CON ARRAY


// BOTONES CUERPO DE LA FACTURA (agr,mod,eli)
   REDEFINE BUTTONBMP aBtn[2] ID 202 OF oDlg ; // AGREGAR PRODUCTOS
      ACTION ( lAgregar := .t. ,; // ACTIVO LOS GETs
         limpiaget( aVar, aGet ) ,; // INICIALIZO LAS var CUERPO FACTURA
         aGet[24]:SetFocus(), aGet[24]:REFRESH() ) ; // VA A COD.
      BITMAP 2004 PROMPT "Agregar" ;
      WHEN ( !EMPTY( aVar[33] ) )

   REDEFINE BUTTONBMP aBtn[3] ID 203 OF oDlg ; // MODIFICAR PRODUCTOS
      ACTION ( IIF( LEN( aProductos ) == 0, lSuma := .f., ) ,;
         lMODIFI := .t., modifipro( aVar, aGet, oBrw, .f. ) ) ; // ACT.LAS var CUERPO FACTURA
      BITMAP 2004 PROMPT "Modificar" ;
      WHEN lSuma .and. LEN( aProductos ) > 0

   REDEFINE BUTTONBMP aBtn[4] ID 204 OF oDlg ; // ELIMINAR PRODUCTOS
      ACTION ( IIF( LEN( aProductos ) == 0, lSuma := .f., ) ,;
         elimipro( aVar, aGet, oBrw ) ) ;
      BITMAP 2004 PROMPT "Eliminar" ;
      WHEN lSuma .and. LEN( aProductos ) > 0
// FIN BOTONES CUERPO DE LA FACTURA (agr,mod,eli)
RETURN

PROCEDURE limpiaget( aVar, aGet ) // INICIALIZO LAS var CUERPO FACTURA

   aVar[26] := SPACE(20)
   aVar[27] := SPACE(100)
   aVar[28] := 1
   aVar[29] := 1
   aVar[30] := 0

   refresget( aGet )

RETURN

PROCEDURE modifipro( aVar, aGet, oBrw, lGraba ) // ACT.TOTALES CUANDO MODIFICO


   IF !lGraba // 1RA.LLAMADA, ACTUALIZO LOS GETs PERO NO EL BROWSE
// ACT.LOS var CON DATOS DEL PRODUCTO A MODIFICAR
      aVar[26] := oBrw:aArrayData[oBrw:nArrayAt,1]
      aGet[24]:REFRESH() // COD.PRODUCTO
      aVar[27] := oBrw:aArrayData[oBrw:nArrayAt,2]
      aGet[25]:REFRESH() // DESCRIPCION.PRODUCTO
      aVar[28] := oBrw:aArrayData[oBrw:nArrayAt,3]
      aGet[26]:REFRESH() // CANTIDAD
      aVar[29] := oBrw:aArrayData[oBrw:nArrayAt,4]
      aGet[27]:REFRESH() // PRECIO UNITARIO
      aVar[30] := oBrw:aArrayData[oBrw:nArrayAt,5]
      aGet[28]:REFRESH() // SUB.TOTAL
      aGet[26]:SetFocus()
      aGet[26]:REFRESH()

   ELSE // 2da.LLAMADA, AHORA SI ACTUALIZO BROWSE
// RESTO DEL MTO.BRUTO SUB.TOTAL DEL REGISTRO MODIFICADO
      aVar[23] := aVar[23] - oBrw:aArrayData[oBrw:nArrayAt,5] // MTO.BRUTO - S.TOTAL
// ELIMINO REG.DEL ARRAY PARA LUEGO AGREGAR EL NUEVO MODIFICADO
      ADEL( oBrw:aArrayData, oBrw:nArrayAt )
      ASIZE( oBrw:aArrayData, oBrw:nLen - 1 )

// SUMO AL MTO.BRUTO NUEVO SUB.TOTAL DEL REGISTRO MODIFICADO
      aVar[23] := aVar[23] + aVar[30]
      aGet[21]:REFRESH() // MTO.BRUTO + S.TOTAL
// AGREGO NUEVO REG.AL ARRAY
      AADD( oBrw:aArrayData, { aVar[26], aVar[27], aVar[28], aVar[29], aVar[28] * aVar[29] } )

      oBrw:MakeTotals(); oBrw:RefreshFooters(); oBrw:REFRESH()

// ACTUALIZO NUEVOS TOTALES
      sumatotal( aVar, aGet, oBrw )

   ENDIF

RETURN

PROCEDURE sumatotal( aVar, aGet, oBrwPro ) // ACTUALIZA TOTALES DE FACTURA(suma y resta)

   aVar[23] := oBrwPro:aCols[5]:nTotal

   aVar[24] := ( aVar[23] * aVar[39] ) / 100

   aVar[25] := aVar[23] + aVar[24]

   refresget( aGet )

   totalpagar( aVar ) // ACT.SAY TOTAL PAGAR

   IF aVar[23] = 0 // solo para pruebas
*      msginfo("No hay Productos para facturar", "PRUEBAS")
      RETURN
   ENDIF

RETURN

PROCEDURE totalpagar( aVar ) // ACT.SAY TOTAL PAGAR

   nTPagar := ROUND( aVar[22] + aVar[25], 2 ) // TOT.APORTE MENSUAL + NETO PAGAR

   aSay[2]:REFRESH() // ACT.TOTAL PAGAR FINAL

RETURN

PROCEDURE refresget( aGet ) // REFRESCA LOS oGET

   DEFAULT lTodos := .t.

   AEVAL( aGet, {|o| IIF( o:ClassName() == "TGET", o:Refresh(), ) } )

RETURN

PROCEDURE elimipro( aVar, aGet, oBrw ) // ELIMINA PRODUCTOS

   IF MSGNOYES("Seguro Desea Eliminar el Código: " + oBrw:aArrayData[oBrw:nArrayAt,1] )
      aVar[23] := aVar[23] - oBrw:aArrayData[oBrw:nArrayAt,5] // MTO.BRUTO - S.TOTAL
      aGet[21]:REFRESH()

      ADEL( oBrw:aArrayData, oBrw:nArrayAt )
      ASIZE( oBrw:aArrayData, oBrw:nLen - 1 )
      oBrw:REFRESH()

      sumatotal( aVar, aGet, oBrw ) // ACT.TOTALES
   ENDIF

RETURN
 


Image
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Ejemplo sencillo de factura

Postby Rosita » Fri Apr 15, 2016 4:25 pm

joseluisysturiz wrote:Aca te mando otra forma de como lo hago en otro sistema sin ser edicion directa en xbrowse...saludos.. :shock:

Code: Select all  Expand view  RUN


PROCEDURE factura()

// DEFINICION BROWSE
   oBrw := TXBrowse():New( oDlg )

   WITH OBJECT oBrw
      :nMarqueeStyle    := MARQSTYLE_HIGHLROW
      :nColDividerStyle := LINESTYLE_BLACK
      :lAllowColSwapping := .f.
      :lAllowColHiding := .f.
      :lColDividerComplete := .t.
      :nHeaderHeight := 30
      :l2007 := .t.
      :lFooter := .t.
      :lRecordSelector := .t.
      :bClrStd := {|| IF( oBrw:nArrayAt % 2 == 0, {CLR_BLACK, CLR_WHITE} ,;
         {0, RGB(203, 226, 254)} ) }
   END WITH
//
   oCol := oBrw:AddCol()
   oCol:cHeader       := "Código"
   oCol:nWidth        := 70
   oCol:bStrData      := {|| IIF( LEN( aProductos ) == 0, SPACE(10) ,;
                              aProductos[oBrw:nArrayAt, 1] ) }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_LEFT
   oCol:nArrayCol := 1
//
   oCol := oBrw:AddCol()
   oCol:cHeader       := "Descripción"
   oCol:nWidth        := 350
   oCol:bStrData      := {|| IIF( LEN( aProductos ) == 0, SPACE(10) ,;
                              aProductos[oBrw:nArrayAt, 2] ) }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_LEFT
   oCol:nArrayCol := 2
//
   oCol := oBrw:AddCol()
   oCol:cHeader       := "Cantidad"
   oCol:nWidth        := 50
   oCol:bStrData      := {|| IIF( LEN( aProductos ) == 0, SPACE(10) ,;
                              aProductos[oBrw:nArrayAt, 3] ) }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_RIGHT
   oCol:nArrayCol := 3
//
   oCol := oBrw:AddCol()
   oCol:cHeader       := "Precio Unitario"
   oCol:nWidth         := 100
   oCol:bStrData      := {|| IIF( LEN( aProductos ) == 0, SPACE(10) ,;
                              TRANSF( aProductos[oBrw:nArrayAt, 4], "@E999,999.99" ) ) }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_RIGHT
   oCol:nArrayCol := 4
//
   oCol := oBrw:AddCol()
   oCol:cHeader       := "Sub-Total"
   oCol:nWidth         := 100
   oCol:bStrData      := {|| IIF( LEN( aProductos ) == 0, SPACE(10) ,;
                              TRANSF( aProductos[oBrw:nArrayAt, 5], "@E999,999.99" ) ) }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_RIGHT
   oCol:nFooterType   := AGGR_SUM
   oCol:nFootStrAlign := AL_RIGHT
   oCol:cDataType     := "N"
   oCol:cEditPicture  := "@E 9,999,999.99"
   oCol:nArrayCol := 5
//
   oBrw:CreateFromResource( 100 )
   oBrw:SetArray( aProductos, .t. )

   oBrw:MakeTotals(); oBrw:RefreshFooters(); oBrw:REFRESH()
// FIN DEFINICION DEL xBROWSE CON ARRAY


// BOTONES CUERPO DE LA FACTURA (agr,mod,eli)
   REDEFINE BUTTONBMP aBtn[2] ID 202 OF oDlg ; // AGREGAR PRODUCTOS
      ACTION ( lAgregar := .t. ,; // ACTIVO LOS GETs
         limpiaget( aVar, aGet ) ,; // INICIALIZO LAS var CUERPO FACTURA
         aGet[24]:SetFocus(), aGet[24]:REFRESH() ) ; // VA A COD.
      BITMAP 2004 PROMPT "Agregar" ;
      WHEN ( !EMPTY( aVar[33] ) )

   REDEFINE BUTTONBMP aBtn[3] ID 203 OF oDlg ; // MODIFICAR PRODUCTOS
      ACTION ( IIF( LEN( aProductos ) == 0, lSuma := .f., ) ,;
         lMODIFI := .t., modifipro( aVar, aGet, oBrw, .f. ) ) ; // ACT.LAS var CUERPO FACTURA
      BITMAP 2004 PROMPT "Modificar" ;
      WHEN lSuma .and. LEN( aProductos ) > 0

   REDEFINE BUTTONBMP aBtn[4] ID 204 OF oDlg ; // ELIMINAR PRODUCTOS
      ACTION ( IIF( LEN( aProductos ) == 0, lSuma := .f., ) ,;
         elimipro( aVar, aGet, oBrw ) ) ;
      BITMAP 2004 PROMPT "Eliminar" ;
      WHEN lSuma .and. LEN( aProductos ) > 0
// FIN BOTONES CUERPO DE LA FACTURA (agr,mod,eli)
RETURN

PROCEDURE limpiaget( aVar, aGet ) // INICIALIZO LAS var CUERPO FACTURA

   aVar[26] := SPACE(20)
   aVar[27] := SPACE(100)
   aVar[28] := 1
   aVar[29] := 1
   aVar[30] := 0

   refresget( aGet )

RETURN

PROCEDURE modifipro( aVar, aGet, oBrw, lGraba ) // ACT.TOTALES CUANDO MODIFICO


   IF !lGraba // 1RA.LLAMADA, ACTUALIZO LOS GETs PERO NO EL BROWSE
// ACT.LOS var CON DATOS DEL PRODUCTO A MODIFICAR
      aVar[26] := oBrw:aArrayData[oBrw:nArrayAt,1]
      aGet[24]:REFRESH() // COD.PRODUCTO
      aVar[27] := oBrw:aArrayData[oBrw:nArrayAt,2]
      aGet[25]:REFRESH() // DESCRIPCION.PRODUCTO
      aVar[28] := oBrw:aArrayData[oBrw:nArrayAt,3]
      aGet[26]:REFRESH() // CANTIDAD
      aVar[29] := oBrw:aArrayData[oBrw:nArrayAt,4]
      aGet[27]:REFRESH() // PRECIO UNITARIO
      aVar[30] := oBrw:aArrayData[oBrw:nArrayAt,5]
      aGet[28]:REFRESH() // SUB.TOTAL
      aGet[26]:SetFocus()
      aGet[26]:REFRESH()

   ELSE // 2da.LLAMADA, AHORA SI ACTUALIZO BROWSE
// RESTO DEL MTO.BRUTO SUB.TOTAL DEL REGISTRO MODIFICADO
      aVar[23] := aVar[23] - oBrw:aArrayData[oBrw:nArrayAt,5] // MTO.BRUTO - S.TOTAL
// ELIMINO REG.DEL ARRAY PARA LUEGO AGREGAR EL NUEVO MODIFICADO
      ADEL( oBrw:aArrayData, oBrw:nArrayAt )
      ASIZE( oBrw:aArrayData, oBrw:nLen - 1 )

// SUMO AL MTO.BRUTO NUEVO SUB.TOTAL DEL REGISTRO MODIFICADO
      aVar[23] := aVar[23] + aVar[30]
      aGet[21]:REFRESH() // MTO.BRUTO + S.TOTAL
// AGREGO NUEVO REG.AL ARRAY
      AADD( oBrw:aArrayData, { aVar[26], aVar[27], aVar[28], aVar[29], aVar[28] * aVar[29] } )

      oBrw:MakeTotals(); oBrw:RefreshFooters(); oBrw:REFRESH()

// ACTUALIZO NUEVOS TOTALES
      sumatotal( aVar, aGet, oBrw )

   ENDIF

RETURN

PROCEDURE sumatotal( aVar, aGet, oBrwPro ) // ACTUALIZA TOTALES DE FACTURA(suma y resta)

   aVar[23] := oBrwPro:aCols[5]:nTotal

   aVar[24] := ( aVar[23] * aVar[39] ) / 100

   aVar[25] := aVar[23] + aVar[24]

   refresget( aGet )

   totalpagar( aVar ) // ACT.SAY TOTAL PAGAR

   IF aVar[23] = 0 // solo para pruebas
*      msginfo("No hay Productos para facturar", "PRUEBAS")
      RETURN
   ENDIF

RETURN

PROCEDURE totalpagar( aVar ) // ACT.SAY TOTAL PAGAR

   nTPagar := ROUND( aVar[22] + aVar[25], 2 ) // TOT.APORTE MENSUAL + NETO PAGAR

   aSay[2]:REFRESH() // ACT.TOTAL PAGAR FINAL

RETURN

PROCEDURE refresget( aGet ) // REFRESCA LOS oGET

   DEFAULT lTodos := .t.

   AEVAL( aGet, {|o| IIF( o:ClassName() == "TGET", o:Refresh(), ) } )

RETURN

PROCEDURE elimipro( aVar, aGet, oBrw ) // ELIMINA PRODUCTOS

   IF MSGNOYES("Seguro Desea Eliminar el Código: " + oBrw:aArrayData[oBrw:nArrayAt,1] )
      aVar[23] := aVar[23] - oBrw:aArrayData[oBrw:nArrayAt,5] // MTO.BRUTO - S.TOTAL
      aGet[21]:REFRESH()

      ADEL( oBrw:aArrayData, oBrw:nArrayAt )
      ASIZE( oBrw:aArrayData, oBrw:nLen - 1 )
      oBrw:REFRESH()

      sumatotal( aVar, aGet, oBrw ) // ACT.TOTALES
   ENDIF

RETURN
 


Image



Hola buenos dias mi estimado Jose Luis, gracias por el aporte de tu codigo, creo que es mas sencillo de entenderle y aplicarle a mi sostema de control no entre ayer,tuve contratiempo en mi trabajo sin mas quedo de ti y del ejemplo agradezco tu atencion prestada acia mi sin nada a cambio

Saludos
Rosa
Rosita
 
Posts: 53
Joined: Tue Aug 18, 2015 7:34 pm

Re: Ejemplo sencillo de factura

Postby joseluisysturiz » Fri Apr 15, 2016 11:46 pm

Saludos Rosita, en este foro siempre encontraras ayuda en todo lo posible, si no de un codigo completo por lo menos de ideas de como hacerlo, hay que dar de gracia lo que se recibe de gracia, todos en algun momento fuimos principiantes y con ayudas y un poco de lectura y practica, nos fuimos superando sabiendo algo mas que algunos algunos pero tambien por menos que otros mas experimentados, y asi se van reeemplazando los escalafones, espero te sirva el codigo y sigo a la orden en lo que pueda...quede esperando dijeras de donde eres, gracias, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 40 guests