#!/opt/bin/perl -U use pal; package pal; if ($#ARGV eq "0") { # Pruefe den Wert: if ($ARGV[0] < 20160101 || $ARGV[0] > 20230101) { print ("Aufruf : stck2his.pl \n"); print ("Beispiel: stck2his.pl 20030603\n"); print ("Ohne Option wird Tagesdatum verwendet! \n"); exit; } $DAT=$ARGV[0]; } else { $DAT=&tb_today(); } $VONDAT=tb_dateoffset( $DAT,-90); $PROTOKOLL="/tmp/stck2his.PROT.MON"; $PROTOKOLL="$PROTOKOLL".$ENV{ 'FIRMAKURZ' }; open (OUT,">>$PROTOKOLL") || die("Datei OUT kann nicht ge|ffnet werden wegen :$!\n",2); #------------------------------------------------------------------------------ # PAL-Programm automatischen generieren der Historiesaetze von # Stuecklistenpositionen # ABlauf: Suche alle Lieferscheine mit Rechnungsdatum Heute # Suche die lieferpositionen und positionen dazu und mache einen EIntrag in # der Historie #------------------------------------------------------------------------------ # Setzen globale Variablen #------------------------------------------------------------------------------ $AB1000_DA = $ENV{ 'AB1000_DA' }; $AB1000_DA || die "Shellvariable AB1000_DA nicht gesetzt\n"; $ENV{'PAKET'} = ab1000; #------------------------------------------------------------------------------- # DB++ Dateien |ffnen: Da nur absolute Pfade f}r das OPEN angegeben werden # duerfen, wird zuerst die Directory $AB1000_DA und anschlie~end die Direc- # tory $ANSCHRIFT_DA untersucht, ob die gewuenschte DB++ Datei vorhanden # ist. Am unteren Bildschirmrand wird angezeigt, welche Datei gerade er- # |ffnet wird. #------------------------------------------------------------------------------- dbopen(HIS,"$AB1000_DA/historie") || die "Pech gehabt wegen HIS $!\n"; dbopen(LIE,"$AB1000_DA/lieferung") || die "Pech gehabt wegen LIE $!\n"; dbopen(LPS,"$AB1000_DA/lieferpos") || die "Pech gehabt wegen LPS $!\n"; dbopen(POS,"$AB1000_DA/positionen") || die "Pech gehabt wegen POS $!\n"; dbinitrec( LIE ); dbselinit( LIE ); dbselect( LIE, 'lie_redat', '>=', $VONDAT ); dbselect( LIE, 'lie_redat', '<=', $DAT ); if (dbfind( LIE )){ do { if ($lie_beltyp <= 5 && $lie_proformakz == 0) { # SUche die Lieferposition dazu dbinitrec( LPS); dbselinit( LPS ); dbselect( LPS, 'lps_lielfdnr', '==', $lie_lfdnr ); if (dbfind(LPS)){ do { # print ("Gefunden LPS: $lie_renr \n"); # Erweiterung 040629:hwa: Nur Positionen, die auch geliefert wurden, # beruecksichtigen. Bei gelschten LPS gab es "0"-Eintraege in HIS if ($lps_lieferme != 0) { # Hole die Positionsdaten dbinitrec( POS); dbselinit( POS ); dbselect( POS, 'pos_lfdnr', '==', $lps_poslfdnr ); if (dbfind(POS)){ # Wenns eine Stuecklistenposition ist: if ($pos_stckl == (-1) && $pos_stcklkz != 10) { # Pruefe, ob es diesen Eintrag in der HIstorie bereits gibt: # Positionsnummer ist -1 wegen der SOrtieranzeige # Selektiere nach Index 1: # his_kdnlfdnr his_beltyp his_renr his_repos # his_firma his_lielfdnr his_lsnr print ("Gefunden Stueckliste: $lie_renr \n"); $netto=0; $ekwert=0; # Hole die Werte der STuecklistenpositionen: # Alle betroffenen Positionen haben die selbe Positionsnummer: dbinitrec( HIS); dbselinit( HIS ); dbselect( HIS, 'his_kdnlfdnr', '==', $lie_adr1 ); dbselect( HIS, 'his_beltyp', '==', 0); dbselect( HIS, 'his_redat', '==', $lie_redat ); dbselect( HIS, 'his_renr', '==', $lie_renr ); dbselect( HIS, 'his_repos', '==', $pos_nr ); dbselect( HIS, 'his_firma', '==', $lie_firma ); dbselect( HIS, 'his_lielfdnr', '==', $lie_lfdnr ); dbselect( HIS, 'his_lsnr', '==', $lie_lsnr ); if (dbfind(HIS)){ do { # Der Vkpreis ist falsch: Immer Listenpreis! $his_vkpreis = 0; $his_x_fertigart = "TEILE-Position"; $netto+=$his_netto; $ekwert+=$his_ekwert; dbupdate(HIS); } while (dbnext(HIS)); } # Lege die Position an: dbinitrec( HIS); dbselinit( HIS ); dbselect( HIS, 'his_kdnlfdnr', '==', $lie_adr1 ); dbselect( HIS, 'his_beltyp', '==', 0); dbselect( HIS, 'his_redat', '==', $lie_redat ); dbselect( HIS, 'his_renr', '==', $lie_renr ); dbselect( HIS, 'his_repos', '==', ($pos_nr-1) ); dbselect( HIS, 'his_firma', '==', $lie_firma ); dbselect( HIS, 'his_lielfdnr', '==', $lie_lfdnr ); dbselect( HIS, 'his_lsnr', '==', $lie_lsnr ); if (dbfind(HIS)){ # Historie UPDATE $his_menge=$lie_beltyp == 5 ? $lps_lieferme * (-1) : $lps_lieferme; $his_lsdat=$lie_lsdat; $his_belnr=$lie_belnr; $his_x_datum=$lie_datum; $his_vkpreis=$Lps_vkpreis; $his_ekpreis=$Lps_ekpreis; $his_rab_001=$Lps_rabatt_001; $his_rab_002=$Lps_rabatt_002; $his_zuschlag_001=$Lps_zuschlag_001; $his_zuschlag_002=$Lps_zuschlag_002; $his_zuab=$Lps_zuab; $his_x_vertr_001=$pos_x_vertr_001; $his_x_vertr_002=$pos_x_vertr_002; $his_x_vertr_003=$pos_x_vertr_003; $his_x_fertigart="KOPF-Position"; $his_bearbeiter=$lie_bearbeiter; $his_artlfdnr=$pos_artlfdnr; $his_bez_001=$Lps_bez_001; $his_bez_002=$Lps_bez_002; $his_netto=$netto; $his_ekwert=$ekwert; $his_x_akvlfdnr=$pos_x_akvlfdnr; $his_x_ip_ek2=$pos_x_ip_ek2; dbupdate(HIS); dbflush(HIS); print OUT ("UPD:$his_renr:$his_redat:$lie_kontonr:$pos_bez_001:$his_x_fertigart\n"); print ("UPD:$his_renr:$his_redat:$lie_kontonr:$pos_bez_001:$his_x_fertigart\n"); } else { # Historie NEU: # Keyfelder: $his_kdnlfdnr=$lie_adr1; $his_beltyp = 0; $his_renr = $lie_renr; $his_repos = ($pos_nr-1); $his_firma = $lie_firma; $his_lielfdnr =$lie_lfdnr; $his_lsnr =$lie_lsnr; $his_lfdnr=&dbgetuniq(HIS); # Wertfelder: $his_menge=$lie_beltyp == 5 ? $lps_lieferme * (-1) : $lps_lieferme; $his_redat=$lie_redat; $his_lsdat=$lie_lsdat; $his_belnr=$lie_belnr; $his_x_datum=$lie_datum; $his_vkpreis=$Lps_vkpreis; $his_ekpreis=$Lps_ekpreis; $his_rab_001=$Lps_rabatt_001; $his_rab_002=$Lps_rabatt_002; $his_zuschlag_001=$Lps_zuschlag_001; $his_zuschlag_002=$Lps_zuschlag_002; $his_zuab=$Lps_zuab; $his_x_vertr_001=$Lps_x_vertr_001; $his_x_vertr_002=$Lps_x_vertr_002; $his_x_vertr_003=$Lps_x_vertr_003; $his_x_fertigart="KOPF-Position"; $his_bearbeiter=$lie_bearbeiter; $his_artlfdnr=$pos_artlfdnr; $his_bez_001=$Lps_bez_001; $his_bez_002=$Lps_bez_002; $his_netto=$netto; $his_ekwert=$ekwert; $his_x_akvlfdnr=$pos_x_akvlfdnr; $his_x_ip_ek2=$pos_x_ip_ek2; dbadd(HIS); dbflush(HIS); print OUT ("ADD:$his_renr:$his_redat:$lie_kontonr:$pos_bez_001\n"); print ("ADD:$his_renr:$his_redat:$lie_kontonr:$pos_bez_001\n"); } } # Ende stckl == -1 } # Ende dbfind POS } # Ende lps_lieferme } while (dbnext(LPS)); } } # ENde beltyp < 5 } while (dbnext(LIE)); } # --------------------------------------------------------------------------- # Schliesse die Dateien wieder # --------------------------------------------------------------------------- dbflush(HIS); dbclose(LIE); dbclose(LPS); dbclose(POS); dbclose(HIS); close(OUT); exit(0);