bf-7a7u7
Goto Top

Mit Access modulo 10 Prüfziffer - Berechnung

Hallo Zusammen,

ich stehe aufm Schlauch und bitte um Hilfe.

Mein Problem:

ich möchte ein Formular entwerfen um Einzahlungsschein (Schweiz) ausdrucken zu können (auf ein vorgedrucktes Blanco-A4).
So den Bericht mit den Werten an die richtige stelle zu platzieren schaffe ich gut, allerdings komme ich mit der Abfrage nicht klar.

Ich muss ein Feld berechnen "Prüfziffer" - dieses wird via Modulo 10 rekursiv berechnet, aus 26 Ziffern (Referenznummer). Ich fand ein Script mit einer Eingabeformular der prima funktioniert und liefert sogar das PDF - ist aber .php!

Meine Frage:
Ist es lösbar ein Feld in der Abfrage mit Modulo10 rekursiv zu berechnen?

Folgendes Feld wird bereits erstellt [RefNr] - 26 stellig, daraus sollte die Prüfziffer generiert werden im Feld [PZ] - danach setze ich beide zusammen EZRef: [RefNr]&[PZ]
Als Beispiel für die Berechnung (aus .php) RefNr: 0550400000000000004002535 Generierte PZ: 3 - ist alles perfekt

Ich schaffe es nicht bzw. finde keine Formel für access um diese Berechnung ausführen zu können.

Falls Ihr fragen wollt - warum nicht via .php?
Daten werden via odbc aus der Wawi mit access geladen und der Einzahlungsschein sollte automatisch bei neuem Datensatz ausgedruckt werden.

Ich wäre froh wenn mit jemand helfen könnte.
Zu meinen "Können" - kann access Abfragen erstellen, Berichte und einfache Abfrageberechnungen.


Hier QuellCode aus der php:

<?php
/*
	Funktion zur automatischenm Generierung eines ESR, oranger Einzahlungsschein mit Referenznummer in CHF (mit 
	vorgedruckter Betragsangabe) der Schweizerischen Post
	
	Benötigt die fpdf-Bibliothek von www.fdpf.org zur dynamischen PDF-Generierung und die Schriftart OCR-B
	
	Alle notwendigen Dateien sind in diesem Paket enthalten
	
	Veröffentlicht unter der GNU General Public License von Openstream Internet Solutions, nick@openstream.ch
*/
function esr($payment_for, $in_favour_of, $bank_account, $invoice_amount, $reference_no, $identification) {
	// POST-Variablen
	$payment_for = $_POST['payment_for'];  
	$in_favour_of = $_POST['in_favour_of'];  
	$bank_account = $_POST['bank_account'];  
	$invoice_amount = $_POST['invoice_amount'];  
	$type = '01'; // Belegart (01 = Beleg mit vordedrucktem Betrag)  
	$reference_no = $_POST['reference_no'];  
	$identification = $_POST['identification'];  
	$esr_no = $_POST['esr_no'];  
	// fpdf-Bibliothek laden
	define('FPDF_FONTPATH','fpdf/font/');  
	require('fpdf/fpdf.php');  
	// Rahmen zur Positionierung der Textelemente aktivieren/deaktivieren
	define('BORDER' , 0);  
	// Neues PDF-Dokument erstellen
	$pdf = new FPDF('P', 'mm', 'a4');  
	$pdf->AddPage();
	$pdf->SetFont('Arial','',8);  
        $pdf->SetAutoPageBreak(false,'');  
	// Leeren ESR in PDF laden
	
	
	// Rechnungsbetrag formatieren für Betragsfeld
	if(!$length_left = strpos($invoice_amount, '.')) $length_left = strlen($invoice_amount);  
	$invoice_amount_left = substr($invoice_amount, 0, $length_left);
	$invoice_amount_right = substr($invoice_amount, $length_left+1, strlen($invoice_amount_left));
	
	// Rechnungsbetrag formatieren für Codezeile (links mit Nullen auf insg. 8 Stellen auffüllen)
	$zeros_amount_left = 8 - $length_left;
	$zeros_amount_left_string = '';  
	for ($zc=0; $zc < $zeros_amount_left; $zc++) $zeros_amount_left_string .= '0';  
	$invoice_amount_left2 = $zeros_amount_left_string . $invoice_amount_left;
	
	// Referenznummer formatieren für Codezeile (lnks mit Nullen auf insg. 20 Stellen auffüllen)
	$zeros_amount_left2 = 20 - strlen($reference_no);
	$zeros_amount_left_string2 = '';  
	for ($zc2=0; $zc2 < $zeros_amount_left2; $zc2++) $zeros_amount_left_string2 .= '0';  
	$reference_no_string = $zeros_amount_left_string2 . $reference_no;
	
	// Codezeile mit vorgedrucktem Betrag erstellen
	
		// Modulo-10-Berechnung der Quersumme der Positionen A - C
		$checkno01 = bcmod(sumofthedigits($type . $invoice_amount_left2 . $invoice_amount_right), 10);
		
		// Modulo-10-Berechnung der Quersumme der Positionen F und G
		$checkno02 = bcmod(sumofthedigits($identification . $reference_no), 10);
	
		
		// Referenznummer formatieren für Referenznummernfeld
		$reference_no_field = $identification . $reference_no_string . $checkno02;
		
		$reference_no_array = array(
				0 => substr($reference_no_field,0,2),
				1 => substr($reference_no_field,2,5),
				2 => substr($reference_no_field,7,5),
				3 => substr($reference_no_field,12,5),
				4 => substr($reference_no_field,17,5),
				5 => substr($reference_no_field,22,5)					
				);
		
		/*echo $reference_no_field . '<br><br><pre>'; 
		print_r($reference_no_array);
		die();*/
		
		
		$reference_no_formated = implode('  ',$reference_no_array);  
	
	
		// Array der gesamten Codezeile
		$besr_code_array = array(
				'A' => $type,					// A = Belegart (01 = Beleg mit vorgedrucktem Betrag  
				'B' => $invoice_amount_left2,			// B = Betrag Franken, rechtsbündig, links mit Nullen aufgefüllt  
				'C' => $invoice_amount_right,			// C = Betrag Rappen  
				'D' => $checkno01,				// D = Prüfziffer der Felder A bis C (Modulo10-Berechnung)  
				'E' => '>',					// E = Steuerzeichen, konstant  
				'F' => $identification,				// F = 6-stellige Kundenidentifikations-Nummer, konstant (von Bank zugeteilt)  
				'G' => $reference_no_string,			// G = 20-stellige Referenz-/Rechnungsnummer für Ihre Faktura- oder Debitorennummber, nicht beanspruchte Stellen sind immer links durch fortlaufende Nullen zu ergänzen  
				'H' => $checkno02,				// H = Prüfziffer der Felder F und G (Modulo10-Berechnung)  
				'I' => '+ ',					// I = Steuerzeichen, konstant  
				'J' => $esr_no,					// J = ESR-Teilnehmer-Nummer der Bank, konstant  
				'K' => '>'						// K = Steuerzeichen, konstant  
				);
		
		$besr_code = implode('', $besr_code_array);  
		
	
	// Alles auf PDF schreiben
		
		// Empfangsschein Texte links
		$pdf->SetXY(0, 201);
		$pdf->MultiCell(60,3.5,$payment_for);
		$pdf->SetXY(0, 215);	
		$pdf->MultiCell(60,3.5,$in_favour_of);
		
		// Texte mitte
		$pdf->SetXY(60, 201);
		$pdf->MultiCell(60,3.5,$payment_for);
		$pdf->SetXY(60, 215);	
		$pdf->MultiCell(60,3.5,$in_favour_of);
		
		// Kontonummer links
		$pdf->SetXY(25, 236);
		$pdf->Cell(31,5,$bank_account,BORDER);
	
		// Kontonummer rechts
		$pdf->SetXY(87, 236);
		$pdf->Cell(31,5,$bank_account,BORDER);	
		
		// Betrag links
		$pdf->setFontSize(12);
		$pdf->SetXY(0, 245);
		$pdf->Cell(41,5,$invoice_amount_left,BORDER,'',R);  
	
		$pdf->SetXY(45, 245);
		$pdf->Cell(10,5,$invoice_amount_right,BORDER);
				
		// Betrag rechts
		$pdf->SetXY(60, 245);
		$pdf->Cell(41,5,$invoice_amount_left,BORDER,'',R);  
	
		$pdf->SetXY(108, 245);
		$pdf->Cell(10,5,$invoice_amount_right,BORDER);

		
		// Formatierte Referenznummer links unten
		$pdf->SetFontSize(10);
		$pdf->SetXY(0, 254);
		$pdf->Cell(58,5,$reference_no_field,BORDER);		
		// Formatierte Referenznummer rechts oben
		$pdf->SetFontSize(12);
		$pdf->SetXY(128, 229);
		$pdf->Cell(83,0,$reference_no_formated,BORDER);		
		
		// Codezeile
		$pdf->AddFont('OCR-B','','ocrb.php');  
		$pdf->SetFont('OCR-B','',12);	  
		$pdf->SetXY(65, 280);
		$pdf->Cell(133,5,$besr_code,BORDER);	
	// pdf ausgeben
	$pdf->Output();
}
function sumofthedigits($digits) {
// Funktion zur Bildung der Quersumme
  settype($zahl, "string");  
  $res = 0;
  for($i=0; $i<strlen($digits); $i++) $res = $res + $digits[$i];
  return $res;
} 


?>

Content-Key: 352996

Url: https://administrator.de/contentid/352996

Printed on: April 24, 2024 at 07:04 o'clock

Mitglied: 134464
134464 Oct 27, 2017 updated at 10:57:02 (UTC)
Goto Top
Schreibs dir als VBA um und nutze die Public Function dann in deiner Spalte, fertig.

Funktionen für Quersumme und Modulo10 findest du alle fix und fertig im Web.

z.B. Modulo10
Public Function Mod10CheckDigit(ByVal str As String) As Integer
    Dim i As Integer
    Dim TotalOdd As Integer
    Dim TotalEven As Integer
    Dim Total As Integer
    Barcode = Trim(str)
    For i = 1 To Len(str) Step 2
        TotalOdd = TotalOdd + CInt(Mid(str, i, 1))
    Next i
    TotalOdd = TotalOdd * 3
    i = 0
    For i = 2 To Len(str) Step 2
        TotalEven = TotalEven + CInt(Mid(str, i, 1))
    Next i
    
    Total = TotalOdd + TotalEven
    Mod10CheckDigit = 10 - IIf(Right(Total, 1) = 0, 10, Right(Total, 1))
End Function
oder Quersumme:
Public Function Quersumme(str As String)
    Dim sum As Long
    For i = 1 To Len(str)
        sum = sum + CInt(Mid(str, i, 1))
    Next
    Quersumme = sum
End Function
Member: bf-7a7u7
bf-7a7u7 Oct 27, 2017 at 11:39:28 (UTC)
Goto Top
Vielen Dank für den Ansatz!

ich schaffe es nicht aus der Abfrage die Spalte "RefNr" als Variable zu deklarieren.

Abfrage gibt nur einen Wert aus!
Mitglied: 134464
Solution 134464 Oct 27, 2017 updated at 11:56:01 (UTC)
Goto Top
Einfach bei der Berechnung den Ausdrucks-Generator nutzen da kannst du per Assi auf jedes Feld zugreifen, du brauchst keine Variable deklarieren!

Ansonsten k.A. wovon du redest... wir sitzen hier im Dunkeln.
Member: bf-7a7u7
bf-7a7u7 Oct 30, 2017 at 11:45:05 (UTC)
Goto Top
Hakki Kokosnuss, vielen Dank für dein Ansatz. Ich werde es bald ausprobieren.