PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → WD22 - Problem on memory with HAdd()/Hmodify
WD22 - Problem on memory with HAdd()/Hmodify
Débuté par Giovanni Carella, 12 jan. 2018 13:08 - 12 réponses
Posté le 12 janvier 2018 - 13:08
Hi guys,
i have a problem.

I have a xls with up 300.000 line and the file is 17Mb. I want to import this xls in my database.
I fill a table with data found in xls, the memory of the exe is up 500Mb in this moment.

I have a procedure to import the data found in the table, in this procedure i have
4 different HAdd and 6 different HModify.

In the middle of the import (more or less) the program close illegally without error, the memory of the exe is up of 1800Mb.

Can you help me?
Posté le 12 janvier 2018 - 13:54
Hi Giovanni,

if I remember correctly, xls files were originally limited to 65535 lines. Now, recent excel versions can manage more, but windev can not, hence your problem, I would guess...

So you could try transforming it first into an xlsX, where there is no limit, and see if windev/your code can manage it, but personnaly I prefer to saveas csv and import the csv. In that case, I have successfully imported files of ANY size, with the appropriate code, of course.

Best regards
Posté le 12 janvier 2018 - 13:58
Hello Gianni

I suggest you to import directly the xls records using an external tool like SqlYOG.
(I suppose you are using MySql db).

It allow you to easily import the data without limitations.

HTH

Gianni
Posté le 12 janvier 2018 - 16:39
*Gianni

I have to use my tool becouse this import can be runned from the end user.

*Facrice

The code with the problem is this

FOR i = 1 _TO_ TABLE_ArticoliSele..Occurrence HTransactionStart(WiNeMo_connection) PROGBAR_totale..Value++ codice_art.prec=TABLE_ArticoliSele.COL_Precodice codice_art.cod=TABLE_ArticoliSele.COL_Codice EDT_Numero_articoli_nel_foglio++ key_articoli is string =HFilterIdentical(articoli,AI_AZIENDAAI_CAPOCODIAI_CODIREST,gsAzienda,codice_art.prec,NoSpace(codice_art.cod)) HReadFirst(articoli,key_articoli) IF HFound(articoli)=True THEN IF RADIO_Vista_radio_button>1 THEN IF RADIO_Vista_radio_button=2 THEN xValoreNew+=TABLE_ArticoliSele.COL_Listino_1 xValoreOld+=articoli.AI_LIS_EURO1 END IF RADIO_Vista_radio_button=3 THEN xValoreNew+=TABLE_ArticoliSele.COL_Costo xValoreOld+=articoli.AI_COS_EURO END END IF TABLE_ArticoliSele.COL_Descrizione<>"" AND CBOX_Descrizione=True THEN articoli.AI_DESCRIZI=TABLE_ArticoliSele.COL_Descrizione END IF TABLE_ArticoliSele.COL_Cod_IVA<>"" AND CBOX_CodIVA=True THEN articoli.AI_CODICIVA=TABLE_ArticoliSele.COL_Cod_IVA END IF TABLE_ArticoliSele.COL_Listino_1<>0 AND CBOX_list1=True THEN IF RADIO_Vista_radio_button=2 THEN articoli.AI_LPR_EURO1=articoli.AI_LIS_EURO1 END articoli.AI_LIS_EURO1=TABLE_ArticoliSele.COL_Listino_1 articoli.AI_DAT_VALI1=EDT_Data_Aggiornamento END IF TABLE_ArticoliSele.COL_Listino_2<>0 AND CBOX_list2=True THEN IF RADIO_Vista_radio_button=2 THEN articoli.AI_LPR_EURO2=articoli.AI_LIS_EURO2 END articoli.AI_LIS_EURO2=TABLE_ArticoliSele.COL_Listino_2 articoli.AI_DAT_VALI2=EDT_Data_Aggiornamento END IF TABLE_ArticoliSele.COL_Listino_3<>0 AND CBOX_list3=True THEN IF RADIO_Vista_radio_button=2 THEN articoli.AI_LPR_EURO3=articoli.AI_LIS_EURO3 END articoli.AI_LIS_EURO3=TABLE_ArticoliSele.COL_Listino_3 articoli.AI_DAT_VALI3=EDT_Data_Aggiornamento END IF TABLE_ArticoliSele.COL_Listino_4<>0 AND CBOX_list4=True THEN IF RADIO_Vista_radio_button=2 THEN articoli.AI_LPR_EURO4=articoli.AI_LIS_EURO4 END articoli.AI_LIS_EURO4=TABLE_ArticoliSele.COL_Listino_4 articoli.AI_DAT_VALI4=EDT_Data_Aggiornamento END IF TABLE_ArticoliSele.COL_Listino_5<>0 AND CBOX_list5=True THEN IF RADIO_Vista_radio_button=2 THEN articoli.AI_LPR_EURO5=articoli.AI_LIS_EURO5 END articoli.AI_LIS_EURO5=TABLE_ArticoliSele.COL_Listino_5 articoli.AI_DAT_VALI5=EDT_Data_Aggiornamento END IF TABLE_ArticoliSele.COL_Gr_merc<>"" AND CBOX_GrMerc=True THEN articoli.AI_CATEMERC=TABLE_ArticoliSele.COL_Gr_merc END IF TABLE_ArticoliSele.COL_Costo<>0 AND CBOX_Costo=True THEN articoli.AI_COS_EURO=TABLE_ArticoliSele.COL_Costo END IF TABLE_ArticoliSele.COL_Gr_sconto<>"" AND CBOX_GrSconto=True THEN articoli.ai_grupscon=TABLE_ArticoliSele.COL_Gr_sconto END IF TABLE_ArticoliSele.COL_Forn_abi<>"" AND CBOX_Forn=True THEN articoli.AI_fornitor=TABLE_ArticoliSele.COL_Forn_abi END IF TABLE_ArticoliSele.COL_Barcode<>"" AND CBOX_barcode=True THEN articoli.ai_barcode=TABLE_ArticoliSele.COL_Barcode END IF TABLE_ArticoliSele.COL_UM1<>"" AND CBOX_UnMis1=True THEN articoli.AI_UNIMIS_1=TABLE_ArticoliSele.COL_UM1 END IF TABLE_ArticoliSele.COL_UM2<>"" AND CBOX_UnMis2=True THEN articoli.AI_UNIMIS_2=TABLE_ArticoliSele.COL_UM2 END IF TABLE_ArticoliSele.COL_Qta_x_conf<>"" AND CBOX_QtaConf=True THEN articoli.AI_RIORMINI=TABLE_ArticoliSele.COL_Qta_x_conf END IF TABLE_ArticoliSele.COL_Cod_ricavo<>"" AND CBOX_CodRic=True THEN articoli.AI_COD_RICA=TABLE_ArticoliSele.COL_Cod_ricavo END IF TABLE_ArticoliSele.COL_Cod_costo<>"" AND CBOX_CodCos=True THEN articoli.AI_COD_COST=TABLE_ArticoliSele.COL_Cod_costo END IF TABLE_ArticoliSele.COL_Art_Par<>"" AND CBOX_ArtPart=True THEN articoli.AI_ART_PART=TABLE_ArticoliSele.COL_Art_Par END IF TABLE_ArticoliSele.COL_Nom_Comb<>"" AND CBOX_Nomencl=True THEN articoli.ai_nomecomb=TABLE_ArticoliSele.COL_Nom_Comb END IF TABLE_ArticoliSele.COL_Tipo_stoc<>"" AND CBOX_TipoStoc=True THEN articoli.ai_tipostoc=TABLE_ArticoliSele.COL_Tipo_stoc END IF TABLE_ArticoliSele.COL_Fatt_Conv<>"" AND CBOX_FatConv=True THEN articoli.AI_CONVERSI=TABLE_ArticoliSele.COL_Fatt_Conv END IF TABLE_ArticoliSele.COL_Note<>"" AND CBOX_Note=True THEN articoli.AI_NOTE=TABLE_ArticoliSele.COL_Note END IF TABLE_ArticoliSele.Col_Art_Stock<>0 AND CBOX_ArtStock=True THEN articoli.AI_FL_STOCK=TABLE_ArticoliSele.Col_Art_Stock END articoli.ai_DataVaria=DateSys() articoli.ai_OraVaria=TimeSys() articoli.ai_dtoravaria=NumToString(DateSys(), “8d”)+TimeToString(TimeSys(),"HHMMSS") HModify(articoli,hRecNumCurrent,hIgnoreDuplicates+hIgnoreIntegrity) TABLE_ArticoliSele..BrushColor=PastelBlue EDT_Numero_articoli_variati++ TABLE_ArticoliSele.COL_VARIAZIONE=1 //Modifico i dati ELSE HReset(articoli) IF CBOX_CreoNuovo=True THEN // creo il nuovo articolo IF NoSpace(codice_art.prec)="" AND NoSpace(codice_art.cod)="" THEN CONTINUE END articoli.AI_AZIENDA=gsAzienda articoli.ai_codiarti=codice_art.prec+NoSpace(codice_art.cod) articoli.AI_CAPOCODI=NoSpace(codice_art.prec) articoli.AI_CODIREST=NoSpace(codice_art.cod) articoli.AI_CODICIVA=tabvar.tava_codi_iva articoli.AI_COD_RICA=tabvar.tava_cod_rica articoli.AI_COD_COST=tabvar.tava_cod_cost IF TABLE_ArticoliSele.COL_Descrizione<>"" THEN articoli.AI_DESCRIZI=TABLE_ArticoliSele.COL_Descrizione END IF TABLE_ArticoliSele.COL_Cod_IVA<>"" THEN articoli.AI_CODICIVA=TABLE_ArticoliSele.COL_Cod_IVA END IF TABLE_ArticoliSele.COL_Listino_1<>0 THEN articoli.AI_LIS_EURO1=TABLE_ArticoliSele.COL_Listino_1 articoli.AI_DAT_VALI1=EDT_Data_Aggiornamento END IF TABLE_ArticoliSele.COL_Listino_2<>0 THEN articoli.AI_LIS_EURO2=TABLE_ArticoliSele.COL_Listino_2 articoli.AI_DAT_VALI2=EDT_Data_Aggiornamento END IF TABLE_ArticoliSele.COL_Listino_3<>0 THEN articoli.AI_LIS_EURO3=TABLE_ArticoliSele.COL_Listino_3 articoli.AI_DAT_VALI3=EDT_Data_Aggiornamento END IF TABLE_ArticoliSele.COL_Listino_4<>0 THEN articoli.AI_LIS_EURO4=TABLE_ArticoliSele.COL_Listino_4 articoli.AI_DAT_VALI4=EDT_Data_Aggiornamento END IF TABLE_ArticoliSele.COL_Listino_5<>0 THEN articoli.AI_LIS_EURO5=TABLE_ArticoliSele.COL_Listino_5 articoli.AI_DAT_VALI5=EDT_Data_Aggiornamento END IF TABLE_ArticoliSele.COL_Gr_merc<>"" THEN articoli.AI_CATEMERC=TABLE_ArticoliSele.COL_Gr_merc END IF TABLE_ArticoliSele.COL_Costo<>0 THEN articoli.AI_COS_EURO=TABLE_ArticoliSele.COL_Costo END IF TABLE_ArticoliSele.COL_Gr_sconto<>"" THEN articoli.ai_grupscon=TABLE_ArticoliSele.COL_Gr_sconto END IF TABLE_ArticoliSele.COL_Forn_abi<>"" THEN articoli.AI_fornitor=TABLE_ArticoliSele.COL_Forn_abi END IF TABLE_ArticoliSele.COL_Barcode<>"" THEN articoli.ai_barcode=TABLE_ArticoliSele.COL_Barcode END IF TABLE_ArticoliSele.COL_UM1<>"" THEN articoli.AI_UNIMIS_1=TABLE_ArticoliSele.COL_UM1 END IF TABLE_ArticoliSele.COL_UM2<>"" THEN articoli.AI_UNIMIS_2=TABLE_ArticoliSele.COL_UM2 END IF TABLE_ArticoliSele.COL_Qta_x_conf<>"" THEN articoli.AI_RIORMINI=TABLE_ArticoliSele.COL_Qta_x_conf END IF TABLE_ArticoliSele.COL_Cod_ricavo<>"" THEN articoli.AI_COD_RICA=TABLE_ArticoliSele.COL_Cod_ricavo END IF TABLE_ArticoliSele.COL_Cod_costo<>"" THEN articoli.AI_COD_COST=TABLE_ArticoliSele.COL_Cod_costo END IF TABLE_ArticoliSele.COL_Art_Par<>"" THEN articoli.AI_ART_PART=TABLE_ArticoliSele.COL_Art_Par END IF TABLE_ArticoliSele.COL_Nom_Comb<>"" THEN articoli.ai_nomecomb=TABLE_ArticoliSele.COL_Nom_Comb END IF TABLE_ArticoliSele.COL_Tipo_stoc<>"" THEN articoli.ai_tipostoc=TABLE_ArticoliSele.COL_Tipo_stoc END IF TABLE_ArticoliSele.COL_Fatt_Conv<>"" THEN articoli.AI_CONVERSI=TABLE_ArticoliSele.COL_Fatt_Conv END IF TABLE_ArticoliSele.COL_Note<>"" THEN articoli.AI_NOTE=TABLE_ArticoliSele.COL_Note END articoli.ai_stato=Left(COMBO_Ai_stato..DisplayedValue,2) articoli.AI_DT_CREAZ=EDT_Data_Aggiornamento articoli.ai_DataVaria=DateSys() articoli.ai_OraVaria=TimeSys() articoli.ai_dtoravaria=NumToString(DateSys(), “8d”)+TimeToString(TimeSys(),"HHMMSS") HAdd(articoli,hIgnoreDuplicates+hIgnoreIntegrity) TABLE_ArticoliSele..BrushColor=PastelGreen EDT_Numero_articoli_variati++ TABLE_ArticoliSele.COL_VARIAZIONE=1 END END IF COL_Posizione<>"" THEN sKey_posart = HFilterIdentical(Posart,POAR_AZIENDAPOAR_DEPOSIPOAR_ARTICO1,gsAzienda,EDT_Deposito,codice_art.prec+NoSpace(codice_art.cod)) HReadFirst(Posart,sKey_posart) IF HFound(Posart) THEN Posart.POAR_POSIZI=COL_Posizione HModify(Posart,hRecNumCurrent,hIgnoreDuplicates+hIgnoreIntegrity) ELSE Posart.POAR_ARTICO=codice_art.prec+NoSpace(codice_art.cod) Posart.POAR_AZIENDA=gsAzienda Posart.POAR_DEPOSI=EDT_Deposito Posart.POAR_POSIZI=COL_Posizione Posart.POAR_QTAPOS=0 HAdd(Posart,hIgnoreDuplicates+hIgnoreIntegrity) END HDeactivateFilter(Posart) END IF RADIO_Vista_radio_button=2 AND EDT_AI_fornitor>0 THEN sKeylistforn=HFilterIdentical(listforn,sapf_aziendasapf_codiartisapf_fornitor,gsAzienda,articoli.ai_codiarti,EDT_AI_fornitor) HReadFirst(listforn,sKeylistforn) IF HFound(listforn) THEN listforn.sapf_prz_list=TABLE_ArticoliSele.COL_Listino_1 listforn.sapf_dt_va_li=EDT_Data_Aggiornamento IF listforn.sapf_per_scon<>0 THEN listforn.sapf_prz_nett=Round((listforn.sapf_prz_list-(listforn.sapf_prz_list*listforn.sapf_per_scon/100)),5) listforn.sapf_prz_nett=Round((listforn.sapf_prz_nett-(listforn.sapf_prz_nett*listforn.sapf_per_sco2/100)),5) listforn.sapf_prz_nett=Round((listforn.sapf_prz_nett-(listforn.sapf_prz_nett*listforn.sapf_per_sco3/100)),5) END HModify(listforn,hRecNumCurrent,hIgnoreDuplicates+hIgnoreIntegrity) ELSE xSc1=0 xSc2=0 sKeytabscf=HFilterIdentical(tabscf,tscf_aziendatscf_fornittscf_grusco,gsAzienda,EDT_AI_fornitor,articoli.ai_grupscon) HReadFirst(tabscf,sKeytabscf) IF HFound(tabscf) THEN xSc1=tabscf.tscf_scont1 xSc2=tabscf.tscf_scont2 END HDeactivateFilter(tabscf) IF xSc1=0 THEN xSc1=articoli.AI_SCO_RIFE END HReset(listforn) listforn.sapf_azienda=gsAzienda listforn.sapf_codiarti=articoli.ai_codiarti listforn.sapf_fornitor=EDT_AI_fornitor listforn.sapf_prz_list=TABLE_ArticoliSele.COL_Listino_1 listforn.sapf_per_scon=xSc1 listforn.sapf_per_sco2=xSc2 listforn.sapf_prz_list=articoli.AI_LIS_EURO1 listforn.sapf_prz_nett=Round((listforn.sapf_prz_list-(listforn.sapf_prz_list*xSc1/100)),5) listforn.sapf_prz_nett=Round((listforn.sapf_prz_nett-(listforn.sapf_prz_nett*xSc2/100)),5) listforn.sapf_dt_va_li=EDT_Data_Aggiornamento HAdd(listforn,hIgnoreDuplicates+hIgnoreIntegrity) END HDeactivateFilter(listforn) END IF RADIO_Vista_radio_button=3 THEN sKeylistforn=HFilterIdentical(listforn,sapf_aziendasapf_codiartisapf_fornitor,gsAzienda,articoli.ai_codiarti,EDT_AI_fornitor) HReadFirst(listforn,sKeylistforn) IF HFound(listforn) THEN IF CBOX_Offerta_temp=1 THEN listforn.sapf_prz_off=TABLE_ArticoliSele.COL_Costo listforn.sapf_dt_i_of=EDT_Dt_Inizio listforn.sapf_dt_f_of=EDT_Dt_fine ELSE listforn.sapf_prz_nett=TABLE_ArticoliSele.COL_Costo listforn.sapf_dt_va_li=EDT_Data_Aggiornamento IF CBOX_Distinta_netti=1 THEN listforn.sapf_per_scon=0 listforn.sapf_per_sco2=0 listforn.sapf_per_sco3=0 ELSE IF listforn.sapf_prz_list<>0 THEN listforn.sapf_per_scon=Abs(((TABLE_ArticoliSele.COL_Costo*100)/listforn.sapf_prz_list)-100) listforn.sapf_per_sco2=0 listforn.sapf_per_sco3=0 END END END HModify(listforn,hRecNumCurrent,hIgnoreDuplicates+hIgnoreIntegrity) ELSE xSc1=0 xSc2=0 sKeytabscf=HFilterIdentical(tabscf,tscf_aziendatscf_fornittscf_grusco,gsAzienda,EDT_AI_fornitor,articoli.ai_grupscon) HReadFirst(tabscf,sKeytabscf) IF HFound(tabscf) THEN xSc1=tabscf.tscf_scont1 xSc2=tabscf.tscf_scont2 END HDeactivateFilter(tabscf) IF xSc1=0 THEN xSc1=articoli.AI_SCO_RIFE END HReset(listforn) listforn.sapf_azienda=gsAzienda listforn.sapf_codiarti=articoli.ai_codiarti listforn.sapf_fornitor=EDT_AI_fornitor listforn.sapf_prz_list=articoli.AI_LIS_EURO1 listforn.sapf_per_scon=xSc1 listforn.sapf_per_sco2=xSc2 IF CBOX_Offerta_temp=1 THEN listforn.sapf_prz_nett=Round((listforn.sapf_prz_list-(listforn.sapf_prz_list*xSc1/100)),5) listforn.sapf_prz_nett=Round((listforn.sapf_prz_nett-(listforn.sapf_prz_nett*xSc2/100)),5) listforn.sapf_prz_off=TABLE_ArticoliSele.COL_Costo listforn.sapf_dt_i_of=EDT_Dt_Inizio listforn.sapf_dt_f_of=EDT_Dt_fine ELSE listforn.sapf_prz_nett=TABLE_ArticoliSele.COL_Costo IF CBOX_Distinta_netti=1 THEN listforn.sapf_per_scon=0 listforn.sapf_per_sco2=0 listforn.sapf_per_sco3=0 ELSE IF listforn.sapf_prz_list<>0 THEN listforn.sapf_per_scon=Abs(((TABLE_ArticoliSele.COL_Costo*100)/listforn.sapf_prz_list)-100) listforn.sapf_per_sco2=0 listforn.sapf_per_sco3=0 END END END HAdd(listforn,hIgnoreDuplicates+hIgnoreIntegrity) END HDeactivateFilter(listforn) END IF RADIO_Vista_radio_button>1 AND CBOX_Cambio_costo=1 AND listforn.sapf_prz_nett>0 THEN HReadFirst(articoli,key_articoli) IF HFound(articoli) THEN articoli.AI_COP_EURO=articoli.AI_COS_EURO articoli.AI_COS_EURO=listforn.sapf_prz_nett articoli.AI_DT_VA_CO=EDT_Data_Aggiornamento IF CBOX_Distinta_netti=1 THEN articoli.AI_FL_NETTO="S" END HModify(articoli,hRecNumCurrent,hIgnoreDuplicates+hIgnoreIntegrity) END END IF TABLE_ArticoliSele.COL_Stato="2" OR TABLE_ArticoliSele.COL_Stato="9" THEN HReadFirst(articoli,key_articoli) IF HFound(articoli) THEN HExecuteQuery(QRY_Ut_Giacenza_tutti_depositi,hQueryDefault,gsAzienda,tabvar.tava_anno_lav,articoli.ai_codiarti) HReadFirst(QRY_Ut_Giacenza_tutti_depositi) IF HFound(QRY_Ut_Giacenza_tutti_depositi) THEN IF QRY_Ut_Giacenza_tutti_depositi.sum_AD_GIACENZA+QRY_Ut_Giacenza_tutti_depositi.sum_ad_giacenza_ap>0 THEN articoli.ai_BlocOrdForn=1 ELSE articoli.ai_stato="03" END HModify(articoli,hRecNumCurrent,hIgnoreDuplicates+hIgnoreIntegrity) END END END HFreeQuery(QRY_Ut_Giacenza_tutti_depositi) END
Posté le 12 janvier 2018 - 18:56
Now I'm confused...

do yo have the problem when importing the xls into a DB file, or later, when processing the DB file itself?
Posté le 12 janvier 2018 - 19:16
I have a problem when process the data file.
Posté le 13 janvier 2018 - 09:43
Update:

i have test my code from yesterday i have uderstand that the problem is not Hadd()/Hmodify.

Now i think the problem is Hreadxxx function...
Posté le 13 janvier 2018 - 12:47
OK, so we can forget everything about excel...

Let see If I understand the original question now...

So, tell me if I'm right :
- your program is running in 32 bits
- you are doing a TON of stuff inside ONE TRANSACTION, which means that everything needs to be kept in memory
- When your program reach 2 GB (limit for 32 bits), it crashes... Which is perfectly normal considering the above.

Solutions :
1. Switch to 64 bits and process on a machine with a TON of RAM (will still crash if not enough RAM/size of file to process
2. PREFERRED: remove the transaction, so that each record is processed individually.

Best regards
Posté le 14 janvier 2018 - 16:51
Thaks Fabrice... At last how to disable transaction?
Posté le 15 janvier 2018 - 14:02
Hi...

well...

your code nearly STARTS with ...HTransactionStart(WiNeMo_connection)...

So I would say that the solution is to NOT start a transaction (and remove everything regarding transactions from your code).

Best regards
Posté le 16 janvier 2018 - 09:33
I tried...

the problem persist on 32bit version.
Posté le 16 janvier 2018 - 09:54
Hi Giovanni,

does this problem occurs in runtime or during testing when developing?

If it is during testing, check if the option Dynamic Audit is enabled.
If so, then disable the Dynamic Audit and try again.

kind regads,
Xavier
Posté le 16 janvier 2018 - 10:36
it happens in both cases