Page 1 of 1

To Nages : error on FW_DbfToArray

Posted: Thu Jul 11, 2019 7:51 am
by Silvio.Falconi
I wish save on archive the aItems created
this is my fields but I not use all on xbrowse

Code: Select all

static cItemFlds  := "INVNUM,SERIAL,ITEMIMG,ITEMCODE,ITEMNAME,QUANTITY,PRICE,TOTALQ,CHECK_IN,CHECK_OUT,DAYS,DISCOUNT,TOTAL,ITEMSTRUCT,ITEMMULTI,ITEMPRNA4,ITEMPRNPOS,RECNO()"
Image




when I try to save there is an error because I save only 13 fields of 18 are on dbf

the error

Code: Select all

pplication
===========
   Path and name: C:\Work\Errori\aarray\test.Exe (32 bits)
   Size: 3,931,648 bytes
   Compiler version: Harbour 3.2.0dev (r1904111533)
   FiveWin  version: FWH 19.05
   C compiler version: Borland/Embarcadero C++ 7.0 (32-bit)
   Windows version: 6.2, Build 9200 

   Time from start: 0 hours 0 mins 28 secs 
   Error occurred at: 07/11/19, 09:40:03
   Error description: Error BASE/1132  Bound error: array access
   Args:
     [   1] = A   { ... } length: 13
     [   2] = N   18

Stack Calls
===========
   Called from: .\source\function\DBFFUNC2.PRG => FW_FIELDSPUT( 789 )
   Called from: .\source\function\DBFFUNC2.PRG => (b)FW_SAVEARRAYTODBF( 737 )
   Called from:  => AEVAL( 0 )
   Called from: .\source\function\DBFFUNC2.PRG => FW_SAVEARRAYTODBF( 737 )
   Called from: test.prg => TEST( 222 )
 

I made a small test

Code: Select all

 
#include "fivewin.ch"

REQUEST DBFCDX
REQUEST DBFFPT
EXTERNAL ORDKEYNO,ORDKEYCOUNT,ORDCREATE,ORDKEYGOTO


static cItemFlds  := "INVNUM,SERIAL,ITEMIMG,ITEMCODE,ITEMNAME,QUANTITY,PRICE,TOTALQ,CHECK_IN,CHECK_OUT,DAYS,DISCOUNT,TOTAL,ITEMSTRUCT,ITEMMULTI,ITEMPRNA4,ITEMPRNPOS,RECNO()"


Function Test()
 Local nInvoice := 1
 Local aItems:= {}
 local cDir     :=".\data\"
 local lNew    := .t.
 local lsave   := .f.
 local aGet[10]


  local oDlg,oBrowse,oFolder
  Local oBtnSave,oBtnClose

  local oBtnArt1,oBtnArt2   // only for test
  local dStagioneMin:= ctod("15/05/2019")
  Local dStagioneMax:= ctod("15/09/2019")

  BuilDbf(cDir)


 if ! lNew
     // copy on aItems the dbf ResItems
      aItems   := RESITEMS->( FW_DbfToArray( cItemFlds, { || RESITEMS->INVNUM ==  nInvoice } ) )
  else

   endif



      DEFINE DIALOG oDlg TITLE "test array" SIZE 1120,650 ;
             PIXEL TRUEPIXEL RESIZABLE

         @ 1, 0 FOLDEREX oFolder OF oDlg SIZE oDlg:nWidth-585,oDlg:nHeight-390 PIXEL  ;
        PROMPT "Reservation","Payments"


       @ 10,10 Button oBtnArt1 PROMPT "ARTICOLO 1"  OF oFolder:aDialogs[1] size 100,40  ACTION INSERT_PRODUCT(aItems,nInvoice,1,oBrowse)
       @ 10,120 Button oBtnArt2 PROMPT "ARTICOLO 2"  OF oFolder:aDialogs[1] size 100,40 ACTION INSERT_PRODUCT(aItems,nInvoice,2,oBrowse)

 @ 120, 02 XBROWSE  oBrowse OF oFolder:aDialogs[1] ;
        COLUMNS 3,4,5,6,7,8,9,10,11,12,13;
        HEADERS "Ico","Tipo","Servizio","Q.tà","Costo","Tot p q.tà","Dal","al","Giorni","Sconto","Totale"   ;
        COLSIZES 55, 55,190,50,90,90,140,140,50,60,90 ;
        PICTURES nil, nil,"@!","9999","€ 999,999.99","€ 999,999.99", "dd-mmmm-yyyy","dd-mmmm-yyyy","999","€ 999,999.99","€ 999,999.99";
        ARRAY aItems       ;
        SIZE 100,82 PIXEL STYLE FLAT NOBORDER

       ADD COLUMN TO XBROWSE oBrowse

   bCalcRow := { || (oBrowse:aCols[ 6 ]:VarPut( oBrowse:aCols[ 4 ]:Value * oBrowse:aCols[ 5 ]:Value ),; // TOTALE PER QUANTITà = PREZZO x QUANTITà
                     oBrowse:aCols[ 9 ]:VarPut((oBrowse:aCols[ 8 ]:Value-oBrowse:aCols[ 7 ]:Value)+1),;  // GIORNI = DATA OUT - DATA IN
                     oBrowse:aCols[ 11 ]:VarPut(( oBrowse:aCols[ 6 ]:value * oBrowse:aCols[ 9 ]:value)-oBrowse:aCols[ 10 ]:value),;
                     CalcoloTotali(oBrowse,aGet)     )}




 WITH OBJECT oBrowse





         WITH OBJECT oBrowse:aCols[ 1]
          :bFooter   := { || Ltrim( Str( oBrowse:KeyNo() ) ) + " / " + LTrim( Str( oBrowse:KeyCount() ) )+" servizi" }
          :lBmpStretch     := .F.
          :lBmpTransparent := .T.
          :nwidth := 30
          :bStrImage       := {|| oBrowse:aArrayData[ oBrowse:narrayat][3] }
         END

         WITH OBJECT oBrowse:aCols[ 4]
          :nWidth        := 100
          :nDataStrAlign := AL_CENTER
          :AddBitmap( { FW_BmpPlus(), FW_BmpMinus() } )

          // Right Button
         :nEditType     := EDIT_BUTTON
         :bEditBlock    := { |r,c,oCol| oCol:Value + 1 }
         :nBtnBmp       := 1
         :lBtnTransparent  := .t.

         // Left Button
         :bBmpData      := { |v,lSel| If( lSel, 2, 0 ) }
         :bBmpAction    := { |oCol| IIF( oCol:Value>0,oCol:VarPut( oCol:Value - 1 ),) }
         :bOnChange := bCalcRow

      END
               WITH OBJECT  oBrowse:aCols[ 5]
                         :cEditPicture := '@ €99,999.99'
                      END

     // colona per totale x qut  riga
                    WITH OBJECT  oBrowse:aCols[ 6]
                        * :nFooterType      := AGGR_SUM
                         :cEditPicture := '@ €99,999.99'
                      END


         WITH OBJECT oBrowse:aCols[ 7]
         :nEditType  := EDIT_BUTTON
         :AddBitmap( "INVOICE_CALENDAR" )
         :nBtnBmp    := 1
         :bEditBlock := { |r,c,o,k| XbrGetDate( o,"Seleziona una data",dStagioneMin,dStagioneMax ) }
         :bOnChange := bCalcRow
      END

           WITH OBJECT oBrowse:aCols[ 8]
         :nEditType  := EDIT_BUTTON
         :AddBitmap( "INVOICE_CALENDAR" )
         :nBtnBmp    := 1
         :bEditBlock := { |r,c,o,k| XbrGetDate( o,"Seleziona una data",dStagioneMin,dStagioneMax ) }

         :bOnChange := bCalcRow

      END


       WITH OBJECT  oBrowse:aCols[ 10]
                  :nEditType     := EDIT_GET
                  :bOnChange := bCalcRow
               END


       // colona per totale riga
                    WITH OBJECT  oBrowse:aCols[ 11]
                         :nFooterType      := AGGR_SUM
                         :cEditPicture := '@ €99,999.99'
                      END






                   WITH OBJECT oBrowse:aCols[ 12]
                       :AddBitmap({"INVOICE_CANCELLA","INVOICE_INCOLLA"})
                       :nBtnBmp := 1
                       :lBmpStretch     := .F.
                       :lBmpTransparent := .T.
                       :nwidth := 30
                       :nEditType := EDIT_BUTTON
                       :bEditBlock := { ||DeleteRow(oBrowse,aGet)  }
                       :nHeadBmpNo := 2
                       :cHeader := ""
                       :bLClickHeader  := { ||DeleteAllRows(oBrowse,aGet)  }
                      END

                      :lDrawBorder      := .t.
                      :lHscroll         := .F.
                      :l2007            := .F.
                      :l2015            := .T.
                      :nStretchCol      := STRETCHCOL_WIDEST
                      :nColDividerStyle := LINESTYLE_LIGHTGRAY
                      :lAllowRowSizing     := .F.
                      :lAllowColSwapping   := .F.
                      :lAllowColHiding     := .F.
                      :nMarqueeStyle       := MARQSTYLE_HIGHLROWMS
                      :CreateFromCode()
    END



       @ 520,680 BTNBMP oBtnSave ;
             PROMPT "Save"  SIZE 130,60 PIXEL OF oDlg;
              RESOURCE "INVOICE_SAVE"  FLAT RIGHT;
             ACTION ( lSave := .T., oDlg:End() )

          @ 520,780 BTNBMP oBtnClose ;
               PROMPT "Chiudi"  SIZE 130,60 PIXEL OF oDlg;
               RESOURCE "INVOICE_EXIT"  FLAT RIGHT;
             ACTION ( oDlg:End() )






    oDlg:bResized  := <||
                local oRect    := oDlg:GetCliRect()
                oFolder:nWidth     := oRect:nRight-2
                oFolder:nHeight    := oRect:nBottom-60

                oBrowse:nTop      := oRect:nBottom-300
                oBrowse:nHeight   := oRect:nBottom-510
                oBrowse:nWidth    := oRect:nWidth - 15

                oBtnSave:nLeft     := oRect:nRight - 300
                oBtnsave:nTop      := oRect:nBottom - 60
                oBtnClose:nLeft    := oRect:nRight - 140
                oBtnClose:nTop     := oRect:nBottom - 60

                oBtnArt1:nTop      := oRect:ntop +60
                oBtnArt1:nLeft     := oRect:nLeft +20
                oBtnArt2:nTop      := oRect:ntop +60
                oBtnArt2:nLeft     := oRect:nLeft +250
                 return nil
                  >

                  ACTIVATE DIALOG oDlg CENTERED;
                  ON INIT EVAL(oDlg:bResized )

 IF lSave

   // save

          AEval( aItems, { |a| a[ 1 ] := nInvoice } )
          AEval( aItems, { |a,i| a[ 2 ] := i } )           // serial row

    XBROWSER aItems

          RESITEMS->( FW_SaveArrayToDBF( cItemFlds, aItems ) )

 ENDIF

RETURN NIL




//--------------------------------------------------------------------------//

Function BuilDbf(cDir)
local aStructure
       local i


if ! File( cDir+"ResItems.dbf" )

         aStructure = {{ "InvNum",      "C",   13, 0 }, ; //Invoice Num
                       { "Serial",      "N",    3, 0 }, ; // number of row
                       { "ItemImg",     "C",  120, 0 }, ; // image of Item
                       { "ItemCode",    "C",    2, 0 }, ; // Item Code  E/S/ P
                       { "ItemName",    "C",   30, 0 }, ; // Item Description
                       { "Quantity",    "N",    3, 3 }, ; // quantity
                       { "Price",       "N",    9, 2 }, ; // price unit
                       { "TotalQ",      "N",    9, 2 }, ; // total for quantity
                       { "Check_in" ,   "D",    8, 0 }, ; // date
                       { "Check_out",   "D",    8, 0 }, ; // date
                       { "Days",        "N",    3, 0 }, ; // total days
                       { "Discount",    "N",    9, 2 }, ; // descount
                       { "Total",       "N",    9, 2 }, ; // total row
                       { "ItemStruct",  "C",   30, 0 }, ; // structure if Itemcode is S
                       { "ItemMulti" ,  "L",    1, 0 }, ; // Is multiple  if Itemcode is S
                       { "ItemPrnA4" ,  "L",    1, 0 }, ; // Print on  A4 if Itemcode is S
                       { "ItemPrnPos",  "L",    1, 0 } }  // Print on  Pos if Itemcode is S

                  DBCreate( cDir+"ResItems", aStructure, "DBFCDX" )

           ENDIF


      USE  &(cDir+"RESITEMS"+".dbf")  VIA "DBFCDX" NEW
      INDEX ON RESITEMS->INVNUM + STR( SERIAL, 3, 0 ) TAG invnum  TO resitems

      return nil

//--------------------------------------------------------------------------//

Function CalcoloTotali(oBrowse,aGet)
   return nil
//--------------------------------------------------------------------------//
Static Function DeleteRow( oBrowse,aGet )
   if msgYesNo( i18n("¿ E' sicuro che devo cancellare questa riga ?") )
  iF ! oBrowse:nArrayAt = 1
   if ! Empty( oBrowse:aArrayData )
      ADel( oBrowse:aArrayData, oBrowse:nArrayAt, .t. )
      oBrowse:MakeTotals()
      oBrowse:Refresh()
      CalcoloTotali(oBrowse,aGet)
   endif
   ELSE
  MsgAlert("Non si può cancellare la prima riga")
Endif

Endif
  return nil
//-------------------------------------------------------------------------//
 //cancella tutte le righe
Static Function DeleteAllRows( oBrowse,aGet )
 if msgYesNo( i18n("¿ E' sicuro che devo cancellare tutto ?") )
   if ! Empty( oBrowse:aArrayData )
      aSize( oBrowse:aArrayData, 0 )
      oBrowse:Refresh()
      oBrowse:MakeTotals()
      CalcoloTotali(oBrowse,aGet)
   endif
  Endif
return nil
//--------------------------------------------------------------------------//


 Function INSERT_PRODUCT(aItems,nInvoice,n,oBrowse)

         local nSerial:= 0
         Local cImmagine := ""
         Local cCode     := "S"
         Local cProdotto := "Articolo"+Ltrim(str(n))
         Local nQuantita := 1
         Local nPrezzo   := 10
         Local ntotaleQ  := nPrezzo*nQuantita
         Local dCheck_in := date()
         Local dCheck_out:= date()+1
         Local nDays     := dCheck_out-dCheck_in
         Local nDiscount := 0
         Local nTotal    := 0

   AaDd(aItems,{nInvoice,nSerial,cImmagine,cCode,cProdotto,nQuantita,nPrezzo,ntotaleQ,;
      dCheck_in,dCheck_out,nDays,nDiscount,nTotal })


     oBrowse:MakeTotals()
   oBrowse:refresh()




   return ni

Re: To Nages : error on FW_DbfToArray

Posted: Sat Jul 13, 2019 8:05 am
by nageswaragunupudi
You have only 12 fields in the DBF. So the array contains only 13 elements.
Please make sure that the list contains all valid field names.

Re: To Nages : error on FW_DbfToArray

Posted: Sat Jul 13, 2019 9:01 am
by Silvio.Falconi
Sorry Nages ,
I wish understand
on Function BuilDbf(cDir) function I'mseeing this structure

Code: Select all

if ! File( cDir+"ResItems.dbf" )

         aStructure = {{ "InvNum",      "C",   13, 0 }, ; //Invoice Num
                       { "Serial",      "N",    3, 0 }, ; // number of row
                       { "ItemImg",     "C",  120, 0 }, ; // image of Item
                       { "ItemCode",    "C",    2, 0 }, ; // Item Code  E/S/ P
                       { "ItemName",    "C",   30, 0 }, ; // Item Description
                       { "Quantity",    "N",    3, 3 }, ; // quantity
                       { "Price",       "N",    9, 2 }, ; // price unit
                       { "TotalQ",      "N",    9, 2 }, ; // total for quantity
                       { "Check_in" ,   "D",    8, 0 }, ; // date
                       { "Check_out",   "D",    8, 0 }, ; // date
                       { "Days",        "N",    3, 0 }, ; // total days
                       { "Discount",    "N",    9, 2 }, ; // descount
                       { "Total",       "N",    9, 2 }, ; // total row
                       { "ItemStruct",  "C",   30, 0 }, ; // structure if Itemcode is S
                       { "ItemMulti" ,  "L",    1, 0 }, ; // Is multiple  if Itemcode is S
                       { "ItemPrnA4" ,  "L",    1, 0 }, ; // Print on  A4 if Itemcode is S
                       { "ItemPrnPos",  "L",    1, 0 } }  // Print on  Pos if Itemcode is S

                  DBCreate( cDir+"ResItems", aStructure, "DBFCDX" )

           ENDIF


      USE  &(cDir+"RESITEMS"+".dbf")  VIA "DBFCDX" NEW
      INDEX ON RESITEMS->INVNUM + STR( SERIAL, 3, 0 ) TAG invnum  TO resitems

      return nil
so I have 17 fields
on variable cItemFlds I have 17 fields 1 for recno() = 18

static cItemFlds := "INVNUM,SERIAL,ITEMIMG,ITEMCODE,ITEMNAME,QUANTITY,PRICE,TOTALQ,CHECK_IN,CHECK_OUT,DAYS,DISCOUNT,TOTAL,ITEMSTRUCT,ITEMMULTI,ITEMPRNA4,ITEMPRNPOS,RECNO()"

at init I create the array aItems

if is new record the array aItems is empty

if the modify record I call this command

aItems := RESITEMS->( FW_DbfToArray( cItemFlds, { || RESITEMS->INVNUM == nInvoice } ) )


the array aItems must contain 17 fields

on xbrowse i not edit all fields but only some fields

ITEMIMG,ITEMCODE,ITEMNAME,QUANTITY,PRICE,TOTALQ,CHECK_IN,CHECK_OUT,DAYS,DISCOUNT,TOTAL

you sad I have on dbf only 12 ...and 13 on array ... why ?



New test

Code: Select all

 
#include "fivewin.ch"

REQUEST DBFCDX
REQUEST DBFFPT
EXTERNAL ORDKEYNO,ORDKEYCOUNT,ORDCREATE,ORDKEYGOTO

REQUEST HB_Lang_IT
    REQUEST HB_CODEPAGE_ITWIN
static cItemFlds  := "INVNUM,SERIAL,ITEMIMG,ITEMCODE,ITEMNAME,QUANTITY,PRICE,TOTALQ,CHECK_IN,CHECK_OUT,DAYS,DISCOUNT,TOTAL,ITEMSTRUCT,ITEMMULTI,ITEMPRNA4,ITEMPRNPOS,RECNO()"
Static nAcconto, nDaSaldare, lSaldato
Static ntotale,nSubTotale,nSconto
STATIC oPanelGray
function Main()

       SET DATE FORMAT "dd-mm-yyyy"
       SET DELETED     ON
       SET CENTURY     ON
       SET EPOCH TO    year( date() ) - 20
       SET MULTIPLE    OFF

       SetBalloon( .T. )

     HB_LangSelect("IT")
     HB_CDPSELECT("ITWIN")


       Test()

       return nil



Function Test()
 Local nInvoice := 1
 Local aItems:= {}
 local cDir     :=".\data\"
 local lNew    := .t.
 local lsave   := .f.
 local aGet[10]
 local oSay[10]

  local oDlg,oBrowse,oFolder,oPanelGray
  Local oBtnSave,oBtnClose
  Local  oFont,oFontBold

  local oBtnArt1,oBtnArt2   // only for test
  local dStagioneMin:= ctod("15/05/2019")
  Local dStagioneMax:= ctod("15/09/2019")

  BuilDbf(cDir)


       nSubTotale:=0
       nSconto:= 0
       nTotale:= 0
       nAcconto:=0
       nDaSaldare:=0
       lSaldato := .f.
       dDataSaldato := "Selezionare una data "


  DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
       DEFINE FONT oFontBold NAME "TAHOMA" SIZE 0,-14 BOLD

 if ! lNew
     // copy on aItems the dbf ResItems
      aItems   := RESITEMS->( FW_DbfToArray( cItemFlds, { || RESITEMS->INVNUM ==  nInvoice } ) )
  else

   endif



      DEFINE DIALOG oDlg TITLE "test array" SIZE 1120,650 ;
             PIXEL TRUEPIXEL RESIZABLE

         @ 1, 0 FOLDEREX oFolder OF oDlg SIZE oDlg:nWidth-585,oDlg:nHeight-390 PIXEL  ;
        PROMPT "Reservation","Payments"


       @ 10,10 Button oBtnArt1 PROMPT "ARTICOLO 1"  OF oFolder:aDialogs[1] size 100,40  ACTION INSERT_PRODUCT(aItems,nInvoice,1,oBrowse,aGet)
       @ 10,120 Button oBtnArt2 PROMPT "ARTICOLO 2"  OF oFolder:aDialogs[1] size 100,40 ACTION INSERT_PRODUCT(aItems,nInvoice,2,oBrowse,aGet)

 @ 120, 02 XBROWSE  oBrowse OF oFolder:aDialogs[1] ;
        COLUMNS 3,4,5,6,7,8,9,10,11,12,13;
        HEADERS "Ico","Tipo","Servizio","Q.tà","Costo","Tot p q.tà","Dal","al","Giorni","Sconto","Totale"   ;
        COLSIZES 55, 55,190,50,90,90,140,140,50,60,90 ;
        PICTURES nil, nil,"@!","9999","€ 999,999.99","€ 999,999.99", "dd-mmmm-yyyy","dd-mmmm-yyyy","999","€ 999,999.99","€ 999,999.99";
        ARRAY aItems       ;
        SIZE 100,62 PIXEL STYLE FLAT NOBORDER

       ADD COLUMN TO XBROWSE oBrowse

   bCalcRow := { || (oBrowse:aCols[ 6 ]:VarPut( oBrowse:aCols[ 4 ]:Value * oBrowse:aCols[ 5 ]:Value ),; // TOTALE PER QUANTITà = PREZZO x QUANTITà
                     oBrowse:aCols[ 9 ]:VarPut((oBrowse:aCols[ 8 ]:Value-oBrowse:aCols[ 7 ]:Value)+1),;  // GIORNI = DATA OUT - DATA IN
                     oBrowse:aCols[ 11 ]:VarPut(( oBrowse:aCols[ 6 ]:value * oBrowse:aCols[ 9 ]:value)-oBrowse:aCols[ 10 ]:value),;
                     CalcoloTotali(oBrowse,aGet)     )}




 WITH OBJECT oBrowse





         WITH OBJECT oBrowse:aCols[ 1]
          :bFooter   := { || Ltrim( Str( oBrowse:KeyNo() ) ) + " / " + LTrim( Str( oBrowse:KeyCount() ) )+" servizi" }
          :lBmpStretch     := .F.
          :lBmpTransparent := .T.
          :nwidth := 30
          :bStrImage       := {|| oBrowse:aArrayData[ oBrowse:narrayat][3] }
         END

         WITH OBJECT oBrowse:aCols[ 4]
          :nWidth        := 100
          :nDataStrAlign := AL_CENTER
          :AddBitmap( { FW_BmpPlus(), FW_BmpMinus() } )

          // Right Button
         :nEditType     := EDIT_BUTTON
         :bEditBlock    := { |r,c,oCol|IIF(!oBrowse:nArrayAt = 1, oCol:Value + 1,) }
         :nBtnBmp       := 1
         :lBtnTransparent  := .t.

         // Left Button
           :bBmpData      := { |v,lSel| If( lSel, 2, 0 ) }
           :bBmpAction    := { |oCol|  IIF(!oBrowse:nArrayAt = 1,IIF( oCol:Value>0,oCol:VarPut( oCol:Value - 1 ),),) }
           :bOnChange := bCalcRow
        END






               WITH OBJECT  oBrowse:aCols[ 5]
                         :cEditPicture := '@ €99,999.99'
                      END

     // colona per totale x qut  riga
                    WITH OBJECT  oBrowse:aCols[ 6]
                        * :nFooterType      := AGGR_SUM
                         :cEditPicture := '@ €99,999.99'
                      END


         WITH OBJECT oBrowse:aCols[ 7]
         :nEditType  := EDIT_BUTTON
         :AddBitmap( "INVOICE_CALENDAR" )
         :nBtnBmp    := 1
         :bEditBlock := { |r,c,o,k| XbrGetDate( o,"Seleziona una data",dStagioneMin,dStagioneMax ) }
         :bOnChange := bCalcRow
      END

           WITH OBJECT oBrowse:aCols[ 8]
         :nEditType  := EDIT_BUTTON
         :AddBitmap( "INVOICE_CALENDAR" )
         :nBtnBmp    := 1
         :bEditBlock := { |r,c,o,k| XbrGetDate( o,"Seleziona una data",dStagioneMin,dStagioneMax ) }

         :bOnChange := bCalcRow

      END


       WITH OBJECT  oBrowse:aCols[ 10]
                  :nEditType     := EDIT_GET
                  :bOnChange := bCalcRow
               END


       // colona per totale riga
                    WITH OBJECT  oBrowse:aCols[ 11]
                         :nFooterType      := AGGR_SUM
                         :cEditPicture := '@ €99,999.99'
                      END






                   WITH OBJECT oBrowse:aCols[ 12]
                       :AddBitmap({"INVOICE_CANCELLA","INVOICE_INCOLLA"})
                       :nBtnBmp := 1
                       :lBmpStretch     := .F.
                       :lBmpTransparent := .T.
                       :nwidth := 30
                       :nEditType := EDIT_BUTTON
                       :bEditBlock := { ||DeleteRow(oBrowse,aGet)  }
                       :nHeadBmpNo := 2
                       :cHeader := ""
                       :bLClickHeader  := { ||DeleteAllRows(oBrowse,aGet)  }
                      END

                      :lDrawBorder      := .t.
                      :lHscroll         := .F.
                      :l2007            := .F.
                      :l2015            := .T.
                      :nStretchCol      := STRETCHCOL_WIDEST
                      :nColDividerStyle := LINESTYLE_LIGHTGRAY
                      :lAllowRowSizing     := .F.
                      :lAllowColSwapping   := .F.
                      :lAllowColHiding     := .F.
                      :nMarqueeStyle       := MARQSTYLE_HIGHLROWMS
                      :CreateFromCode()
    END










@ oBrowse:nBottom+5,5 SAY oSay[3] Prompt "SubTotale: €" OF  oFolder:aDialogs[1] PIXEL SIZE 70,20 TRANSPARENT
 @ oBrowse:nBottom+5,75 GET aGet[5] VAR nSubTotale  SIZE 40,12 PIXEL OF oFolder:aDialogs[1] PICTURE ' 99,999.99' READONLY

 @ oBrowse:nBottom+5,5 SAY oSay[4] Prompt "Sconto :" OF  oFolder:aDialogs[1] PIXEL SIZE 70,20 TRANSPARENT
 @ oBrowse:nBottom+5,75 GET aGet[6] VAR nSconto  SIZE 40,12 PIXEL RIGHT PICTURE ' 99,999.99' OF oFolder:aDialogs[1];
 ON CHANGE (aGet[6]:assign(),CalcoloTotali(oBrowse,aGet) )

 @ oBrowse:nBottom+5,5 SAY oSay[5] Prompt "Totale: €" OF  oFolder:aDialogs[1] PIXEL FONT oFontBold SIZE 70,20 TRANSPARENT
 @ oBrowse:nBottom+5,75 GET aGet[7] VAR nTotale  SIZE 40,12 PIXEL PICTURE ' 99,999.99' OF oFolder:aDialogs[1]  READONLY


*  @ oBrowse:nBottom-25,5  GET aGet[9] VAR nDaSaldare  SIZE 100,12 PIXEL PICTURE ' 99,999.99'  OF  oFolder:aDialogs[1] READONLY  UPDATE





       @ 520,680 BTNBMP oBtnSave ;
             PROMPT "Save"  SIZE 130,60 PIXEL OF oDlg;
              RESOURCE "INVOICE_SAVE"  FLAT RIGHT;
             ACTION ( lSave := .T., oDlg:End() )

          @ 520,780 BTNBMP oBtnClose ;
               PROMPT "Chiudi"  SIZE 130,60 PIXEL OF oDlg;
               RESOURCE "INVOICE_EXIT"  FLAT RIGHT;
             ACTION ( oDlg:End() )






    oDlg:bResized  := <||
                local oRect    := oDlg:GetCliRect()
                oFolder:nWidth     := oRect:nRight-2
                oFolder:nHeight    := oRect:nBottom-60

                oBrowse:nTop      := oRect:nBottom-300
               * oBrowse:nHeight   := oRect:nBottom-550
                oBrowse:nWidth    := oRect:nWidth - 15

                oBtnSave:nLeft     := oRect:nRight - 300
                oBtnsave:nTop      := oRect:nBottom - 60
                oBtnClose:nLeft    := oRect:nRight - 140
                oBtnClose:nTop     := oRect:nBottom - 60

                oBtnArt1:nTop      := oRect:ntop +60
                oBtnArt1:nLeft     := oRect:nLeft +20
                oBtnArt2:nTop      := oRect:ntop +60
                oBtnArt2:nLeft     := oRect:nLeft +250

                oPanelGray:nTop    :=  oRect:nBottom - 130
                oPanelGray:nwidth  := oRect:nRight - 18


                   oSay[3]:nTop          := oRect:nBottom - 163   //subtotale
                   oSay[3]:nLeft         := oRect:nRight - 500

                   oSay[4]:nTop          := oRect:nBottom - 163    //sconto
                   oSay[4]:nLeft         := oRect:nRight - 330

                   oSay[5]:nTop          := oRect:nBottom - 163   //totale
                   oSay[5]:nLeft         := oRect:nRight - 175

                    aGet[5]:nTop          := oRect:nBottom - 165
                   aGet[5]:nLeft         := oRect:nRight - 430

                   aGet[6]:nTop          := oRect:nBottom - 165
                   aGet[6]:nLeft         := oRect:nRight - 260

                   aGet[7]:nTop          := oRect:nBottom - 165
                   aGet[7]:nLeft         := oRect:nRight - 100









                 return nil
                  >

                  ACTIVATE DIALOG oDlg CENTERED;
                  ON INIT ( oPanelGray   := PanelGray(oFolder),;
                            PanelAcconto(oPanelGray, nAcconto, nDaSaldare,lSaldato,dDataSaldato,aGet,oBrowse),;
                            EVAL(oDlg:bResized ) )

IF lSave

   // save
          if ! Empty( oBrowse:aDeleted )
            AEval( oBrowse:aDeleted, { |a| a[ 18 ] := -a[ 18] } )
            RESITEMS->( FW_SaveArrayToDBF( cItemFlds, oBrowse:aDeleted ) )
         endif

          AEval( aItems, { |a| a[ 1 ] := nInvoice } )
          AEval( aItems, { |a,i| a[ 2 ] := i } )

    XBROWSER aItems

          RESITEMS->( FW_SaveArrayToDBF( cItemFlds, aItems ) )

 ENDIF

RETURN NIL






Function BuilDbf(cDir)
local aStructure
       local i


if ! File( cDir+"ResItems.dbf" )

         aStructure = {{ "InvNum",      "C",   13, 0 }, ; //Invoice Num
                       { "Serial",      "N",    3, 0 }, ; // number of row
                       { "ItemImg",     "C",  120, 0 }, ; // image of Item
                       { "ItemCode",    "C",    2, 0 }, ; // Item Code  E/S/ P
                       { "ItemName",    "C",   30, 0 }, ; // Item Description
                       { "Quantity",    "N",    3, 3 }, ; // quantity
                       { "Price",       "N",    9, 2 }, ; // price unit
                       { "TotalQ",      "N",    9, 2 }, ; // total for quantity
                       { "Check_in" ,   "D",    8, 0 }, ; // date
                       { "Check_out",   "D",    8, 0 }, ; // date
                       { "Days",        "N",    3, 0 }, ; // total days
                       { "Discount",    "N",    9, 2 }, ; // descount
                       { "Total",       "N",    9, 2 }, ; // total row
                       { "ItemStruct",  "C",   30, 0 }, ; // structure if Itemcode is S
                       { "ItemMulti" ,  "L",    1, 0 }, ; // Is multiple  if Itemcode is S
                       { "ItemPrnA4" ,  "L",    1, 0 }, ; // Print on  A4 if Itemcode is S
                       { "ItemPrnPos",  "L",    1, 0 } }  // Print on  Pos if Itemcode is S

                  DBCreate( cDir+"ResItems", aStructure, "DBFCDX" )

           ENDIF


      USE  &(cDir+"RESITEMS"+".dbf")  VIA "DBFCDX" NEW
      INDEX ON RESITEMS->INVNUM + STR( SERIAL, 3, 0 ) TAG invnum  TO resitems

      return nil

//--------------------------------------------------------------------------//

Function CalcoloTotali(oBrowse,aGet)
  Local n

   nTotale:= 0
   nSubtotale:= 0
   nDaSaldare:= 0

   For n=1 to Len(oBrowse:aArrayData)
      nSubtotale+=  oBrowse:aArrayData[n][13]
     next


    IF nSconto >0
        nTotale:=nSubTotale-nSconto
     else
        nTotale:=nSubTotale
     Endif


        nDaSaldare:=nTotale-nAcconto


   aGet[5]:refresh()  // subtotale
   aGet[7]:refresh()  // totale

   * aGet[8]:refresh()  // acconto

   aGet[9]:refresh()  // da saldare



   oBrowse:Refresh(.f.)
 *  oBrowse:GoBottom()

   return nil



//-----------------------------------------------------------------------//
Static Function DeleteRow( oBrowse,aGet )
   if msgYesNo( i18n("¿ E' sicuro che devo cancellare questa riga ?") )
  iF ! oBrowse:nArrayAt = 1
   if ! Empty( oBrowse:aArrayData )
      ADel( oBrowse:aArrayData, oBrowse:nArrayAt, .t. )
      oBrowse:MakeTotals()
      oBrowse:Refresh()
      CalcoloTotali(oBrowse,aGet)
   endif
   ELSE
  MsgAlert("Non si può cancellare la prima riga")
Endif

Endif
  return nil
//-------------------------------------------------------------------------//
 //cancella tutte le righe
Static Function DeleteAllRows( oBrowse,aGet )
 if msgYesNo( i18n("¿ E' sicuro che devo cancellare tutto ?") )
   if ! Empty( oBrowse:aArrayData )
      aSize( oBrowse:aArrayData, 0 )
      oBrowse:Refresh()
      oBrowse:MakeTotals()
      CalcoloTotali(oBrowse,aGet)
   endif
  Endif
return nil
//--------------------------------------------------------------------------//


 Function INSERT_PRODUCT(aItems,nInvoice,n,oBrowse,aGet)

         local nSerial:= 0
         Local cImmagine := ""
         Local cCode     := "S"
         Local cProdotto := "Articolo"+Ltrim(str(n))
         Local nQuantita := 1
         Local nPrezzo   := 10
         Local ntotaleQ  := nPrezzo*nQuantita
         Local dCheck_in := date()
         Local dCheck_out:= date()+1
         Local nDays     := dCheck_out-dCheck_in
         Local nDiscount := 0
         Local nTotal    := ntotaleQ *  nDays
         Local cItemStruct:= ""
         Local lItemMulti   := .f.
         Local lItemPrnA4   := .t.
         Local lItemPrnPos  := .t.


         AaDd(aItems,{nInvoice,nSerial,cImmagine,cCode,cProdotto,nQuantita,nPrezzo,ntotaleQ,;
      dCheck_in,dCheck_out,nDays,nDiscount,nTotal,cItemStruct,lItemMulti,lItemPrnA4,lItemPrnPos })












   CalcoloTotali(oBrowse,aGet)

     oBrowse:MakeTotals()
   oBrowse:refresh()




   return nil





//----------------------------------------------------------------------------------//
 function PanelGray(oFld)
  local oPanel,oBrushGray
  Local aGradgray := { nRgb(211,211,211),nRgb(211,211,211)}
  DEFINE BRUSH oBrushGray GRADIENT aGradgray
     oPanel:=Tpanel():New( 35, 5, 75, oFld:aDialogs[1]:nWidth-5, oFld:aDialogs[1])
     oPanel:SetBrush( oBrushGray )
     oPanel:bPainted := { || oPanel:Box( 1,1,oPanel:nHeight-1,oPanel:nWidth-1 ) }
     return oPanel
//----------------------------------------------------------------------------------//

Function  PanelAcconto(oPanelGray, nAcconto, nDaSaldare,lSaldato,dDataSaldato,aGet,oBrowse)
   Local coloreRosa:= nRGB(255,182,193)
   Local coloregiallo:= nRGB(253,251,135)
   Local oBtnSaldato

  @ 8, 5 SAY "Acconto : " OF oPanelGray SIZE 85, 21 PIXEL  TRANSPARENT
  @ 6.5,82 GET aGet[8] VAR nAcconto  SIZE 100,24 PIXEL OF oPanelGray  PICTURE ' 99,999.99' COLOR CLR_BLACK,coloregiallo ;
     ON CHANGE (aGet[8]:assign(),CalcoloTotali(oBrowse,aGet))

 @ 8,200 SAY "Da Saldare :" OF  oPanelGray PIXEL SIZE 90,20 TRANSPARENT
 @ 6.5,292 GET aGet[9] VAR nDaSaldare  SIZE 100,24  PIXEL PICTURE ' 99,999.99'  OF oPanelGray READONLY  UPDATE

          *SetGradientBtnbmp(2010,oBtnSaldato)











 return nil




New error

Code: Select all

Application
===========
   Path and name: C:\Work\Errori\aarray\test.Exe (32 bits)
   Size: 3,938,304 bytes
   Compiler version: Harbour 3.2.0dev (r1904111533)
   FiveWin  version: FWH 19.05
   C compiler version: Borland/Embarcadero C++ 7.0 (32-bit)
   Windows version: 6.2, Build 9200 

   Time from start: 0 hours 0 mins 17 secs 
   Error occurred at: 13-07-2019, 11:05:07
   Error description: Error BASE/1132  Limiti superati: accesso all'array
   Args:
     [   1] = A   { ... } length: 17
     [   2] = N   18

Stack Calls
===========
   Called from: .\source\function\DBFFUNC2.PRG => FW_FIELDSPUT( 789 )
   Called from: .\source\function\DBFFUNC2.PRG => (b)FW_SAVEARRAYTODBF( 737 )
   Called from:  => AEVAL( 0 )
   Called from: .\source\function\DBFFUNC2.PRG => FW_SAVEARRAYTODBF( 737 )
   Called from: test.prg => TEST( 319 )
   Called from: test.prg => MAIN( 28 )

on this picture I see 17 fields

Image


Seeing yunus .prg I not need autoappend and I manage the delete row from my functions

DeleteRow( oBrowse,aGet ) one row
DeleteAllRows( oBrowse,aGet ) all rows