Seite 1 von 1

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

Verfasst: Di, 23. Mär 2021 16:01
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.

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

Verfasst: Di, 23. Mär 2021 17:18
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> )

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

Verfasst: Di, 23. Mär 2021 17:28
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.

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

Verfasst: Di, 23. Mär 2021 20:18
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.

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

Verfasst: Mi, 24. Mär 2021 6:57
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.