Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hi,

hab n skript geschrieben das werte aus ner db ließt und ausgiebt.

jetzt hab ich nur ein kleines problem, die einzelnen datensätze haben stark unterschiedliche längen (zwischen 4 und 40 zeichen).

da es eine konsolenausgabe ist, ist diese sehr unüberischtlich.

daher dachte ich dann, ich formatiere die strings mit sprintf.

das sieht wie folgt aus:


while( @row = $refcursor->fetchrow_array()){

 $retval = $retval . sprintf("%-20s = %${row_len}s %s\n", $row[1], $row[4], $row[0]);

}

Nun ist mir aber aufgefallen dass das so nicht geht. Denn ich brauch alle Datensätze aus der Abfrage, muss die länge aller $row[4] Werte vergleichen und mir den großten speichern und dann zur $row_len machen. Das sieht dann so aus

 while($x <= $row){    #$x ist die Zählervariable und 0

  if($row_len < length $row[4]){

   $row_len = length $row[4];

  }

 $x++;

 }

Nun frage ich mich allerdings wie ich die beiden Stücke miteinander verbinde das es auch funktioniert. Hab da mal rumgespielt, das sieht dann wie folgt aus:

while( @row = $refcursor->fetchrow_array()){

  if($row_len < length $row[4]){

   $row_len = length $row[4];

  }

 $retval = $retval . sprintf("%-20s = %${row_len}s %s\n", $row[1], $row[4], $row[0]);

}

Was aber auch nicht geht da der string ja immer gleich im Anschluss formatiert wird und somit die Länge so groß ist wie bis zu dem Zeitpunkt. kommt später was größeres juckt des die ersten Zeilen nich viel :(

Weiß da jemand ne bessere Lösung?

Was für eine Datenbank benutzt Du denn? Evtl. kann Dir bereits die Datenbank einiges an Arbeit abnehmen (z.B. lpad und rpad - falls vorhanden).

Was mir noch nicht ganz klar ist wie so ein Ergebnisausgabe aussehen soll. Da wäre ein kleines Beispiel sicherlich nicht ganz verkehrt.

Thx für die Antwort, hab da schon etwas rumgetestet, letztendlich hat mir n Kollege geholfen, sieht nun so aus:


my $oraProc = "BEGIN pmisp_product_filldynattrib( $intart_id, $xfregid, \'$lang\',\'$lang\', $intstatussp, :x); END;";

		$sth = $dbh->prepare($oraProc);

		$sth->bind_param_inout( ":x", \$refcursor, 0, { ora_type => ORA_RSET } );

		$sth->execute;

		$sth->finish;


		$val_len = 0;


		while( @row = $refcursor->fetchrow_array()){

			my $attid = $row[1];

			my $attval = $row[4];

			my $attname = $row[0];

			my $vallen = length($attval);

			my $idlen  = length($attid);

			if($val_len < $vallen){

				$val_len = $vallen; #Bestimmen der maximalen Spaltenbreite

			}

			if($id_len < $idlen){

				$id_len = $idlen; #Bestimmen der maximalen Spaltenbreite

			}

			my @data = ($attid, $attval, $attname);

			push(@attribute, \@data);


		}#while( @row = $refcursor->fetchrow_array())


#Kontrollstrukturen...


foreach $data (@attribute) {

		my ($attid, $attval, $attname) = @$data;

		$retval = $retval . sprintf("%-${id_len}s  =  %-${val_len}s  (%s)\n", $attid, $attval, $attname);

#Festlegen der Spalten

	}#foreach my $data (@attribute)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.