Parameter direkt übergeben ohne diese neu aufzuzählen ...

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Parameter direkt übergeben ohne diese neu aufzuzählen ...

Beitrag von brandelh »

Hallo,

ich habe Beispielcode mit #command um ? oder ?? zu nutzen um Daten in XLSX Blätter zu schreiben von Osvaldo.
Bei der Einarbeitung in meine HBLibXL fiel mir auf, dass beide Methoden im Prinzip gleich sind, nur bei Q wird noch der Zeilenvorschub eingebaut.

Code: Alles auswählen

// Q, QQ etc. von/from Osvaldo Ramírez
// ? xxxx => oSheet:Q(...xxxx...)        
#command  ?  [<list,...>]  =>  oSheet:Q( <list> ) 
#command  ?? [<list,...>]  =>  oSheet:QQ( <list> )

Code: Alles auswählen

METHOD xlSheet:QQ()
  LOCAL cText
  LOCAL i,nParams
  LOCAL xValue,cType
  LOCAL aValues := {}
  ******* how many params?
  nParams := PCount()
  IF nParams > 1

     FOR i := 1 TO nParams
       aadd( aValues , { PValue(i) , valtype( PValue(i) )})
     NEXT
  ELSE
    if nParams = 1
      xValue := PValue(1)
      // Vamos a ver si la separacion es por chr(19)
      do while ! empty( xValue )
         if at( chr(9)  , xValue ) > 0
            aadd( aValues , { substr( xValue , 1 , at( chr(9)  , xValue )-1) , 'C' })
            xValue := substr( xValue ,  at( chr(9)  , xValue )+1)
         else
            aadd( aValues , {  xValue , 'C' })
            exit
         endif
      enddo
    endif
  ENDIF


  FOR i := 1 to len( aValues )
      IF aValues[i][2] == "C"
        ::SheetWriteStr( ::qRow , ::qCol , aValues[i][1] )
     ELSEIF aValues[i][2] == "D"
        ::SheetWriteDate( ::qRow , ::qCol ,aValues[i][1] )
     ELSEIF aValues[i][2] == "N"
        ::SheetWriteNum( ::qRow , ::qCol , aValues[i][1])
     ELSEIF aValues[i][2] == "L"
        ::SheetWriteStr( ::qRow , ::qCol , var2char( aValues[i][1] ))
     ENDIF
     ::qCol ++
  NEXT

RETURN NIL

Code: Alles auswählen

METHOD xlSheet:Q()
  LOCAL cText
  LOCAL i,nParams
  LOCAL xValue,cType
  LOCAL aValues := {}
  ******* how many params?
  nParams := PCount()
  IF nParams > 1

     FOR i := 1 TO nParams
       aadd( aValues , { PValue(i) , valtype( PValue(i) )})
     NEXT
  ELSE

    if nParams = 1
      xValue := PValue(1)
      // Vamos a ver si la separacion es por chr(19)
      do while ! empty( xValue )
         if at( chr(9)  , xValue ) > 0
            aadd( aValues , { substr( xValue , 1 , at( chr(9)  , xValue )-1) , 'C' })
            xValue := substr( xValue ,  at( chr(9)  , xValue )+1)
         else
            aadd( aValues , {  xValue , 'C' })
            exit
         endif
      enddo
    endif
  ENDIF

  FOR i := 1 to len( aValues )
      IF aValues[i][2] == "C"
        ::SheetWriteStr( ::qRow , ::qCol , aValues[i][1] )
     ELSEIF aValues[i][2] == "D"
        ::SheetWriteDate( ::qRow , ::qCol ,aValues[i][1])
     ELSEIF aValues[i][2] == "N"
        ::SheetWriteNum( ::qRow , ::qCol , aValues[i][1])
     ELSEIF aValues[i][2] == "L"
        ::SheetWriteStr( ::qRow , ::qCol , var2char( aValues[i][1] ))
     ENDIF
     ::qCol ++
  NEXT
  
  *** HB *** nur das ist unterschiedlich
  ::qCol := 0
  ::qRow ++
  *** HB ***

RETURN NIL
Warum hat Osvaldo das so geschrieben, ich vermute dass er - wie ich auch - nicht in der Lage war die Parameter, welche an Q übergeben wurden einfach an QQ weiter zu reichen ohne sie neu zu verpacken ...

Hat jemand eine Idee ?

Code: Alles auswählen

? "Unbestimmte Anzahl","von","Paramtern sind das Problem " , nZahl ...
=> 
o:Q() // hier kommen die von COMMAND übergebenen ? Parameter an ...
...
method x:Q()
    // Parameter ermitteln und weitergeben an QQ ...
    ::QQ() --- aber wie wenn QQ auch direkt von Command aufgerufen werden kann ohne alles wieder zu verpacken ????
    *** HB *** nur das ist unterschiedlich
    ::qCol := 0
    ::qRow ++
    *** HB ***
return NIL
so bräuchte ich das nur in Methode QQ ablegen und spare mir 2 mal fast den gleichen Code in 2 Methoden,
aber mir fällt kein Weg ein, die Parameter einfach durchzureichen ohne alles in Vars umzuladen etc.

Natürlich könnte ich die Schnittstelle ändern, aber dann würde ich seinen Code brechen, das will ich nicht.
Gruß
Hubert
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Parameter direkt übergeben ohne diese neu aufzuzählen ...

Beitrag von Marcus Herz »

Wie wärs mit einem zusätzlichen Parameter, den du dann abfragen kannst

Code: Alles auswählen

// Q, QQ etc. von/from Osvaldo Ramírez
// ? xxxx => oSheet:Q(...xxxx...)        
#command  ?  [<list,...>]  =>  oSheet:Q( .f.,<list> ) 
#command  ?? [<list,...>]  =>  oSheet:Q( .t., <list> )
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Parameter direkt übergeben ohne diese neu aufzuzählen ...

Beitrag von brandelh »

schöner wäre es wohl, aber ich will den code nicht brechen und man kann ja auch Q oder QQ direkt aufrufen.
Gruß
Hubert
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Parameter direkt übergeben ohne diese neu aufzuzählen ...

Beitrag von Marcus Herz »

Ja, da fällt mir auch nichts elegantes dazu ein, außer alle Parameter wieder in einen Codeblock zu stecken....
Wenn ich mir das #command ansehe: schon merkwürdig auf eine konstante Variable weiterzuleiten.
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Parameter direkt übergeben ohne diese neu aufzuzählen ...

Beitrag von brandelh »

ich kenne mich mit den #command etc. nicht so aus, aber das ist wohl die Syntax für eine unbestimmte Anzahl an Parametern, so wie man ? normal auch aufruft.
Hier ist der Beispiel-Code

Code: Alles auswählen

#command  ?  [<list,...>]  =>  oSheet:Q( <list> )
#command  ?? [<list,...>]  =>  oSheet:QQ( <list> )
..........
aDatas <= Containg the info


oBook := xlCreateBook(cLName,cLKey)
if oBook # NIL
   oSheet := oBook:BookAddSheet("Sheet1" )
   if ! empty(oSheet)
      // Header
      ? "No de Factura"+chr(9)+"No. de Receta"+chr(9)+"Codigo EAN"+chr(9)+"Descripcion del medicamento"+chr(9)+"Numero de piezas"+chr(9)+;
         "Importe Unitario"+chr(9)+"Importe Subotal"+chr(9)+"Porcentaje Descuento"+chr(9)+"Importe de descuento"+chr(9)+"Importe IVA"
      // body
      for  aRecno := 1 to len( aDatas )
                ? aDatas[i][1],;
                  aDatas[i][2],;
                  aDatas[i][3],;
                  aDatas[i][4],;
                  aDatas[i][5],;
                  aDatas[i][6],;
                  aDatas[i][7],;
                  aDatas[i][8],;
                  aDatas[i][9]
      next
      oBook:BookSave( "test.xls")
      oBook:destroy()
   endif
endif

*
Saludos
Osvaldo Ramírez
beim Header wird ein String mit TAB übergeben, bei den Daten 9 einzelne Werte, aber es könnten auch flexibel unterschiedliche sein und selbst auch TAB enthalten.
Gruß
Hubert
Antworten