RE:Libreria TWCGI y ejemplo practico
Luis:
La clase a la que haces mención forma parte de una suite de desarrollo web de CiberTec llamada WebAS (Web Application System).
La Suite está compuesta de:
La Clase TWCgi
La Clase TWebPrn
La Clase TWebBrowse
El prg WebTools (con las funciones de soporte Web)
El servidor Web WebAS (escrito en Xailer, es opcional su uso, puedes usar IIS, Apache o cualqueir otro que soporte CGI)
Y la lib XaScript de Xailer que es en realidad la que hace toda la magia Web.
Ningun componente de estos es de libre distribución, los incluye CiberTec con todo y el código fuente en el curso de programación para Web con Harbour.
Usar WebAS no es absolutamente nada complicado, el problema inicial consisten en "entender" como funciona un interpretador de código, una vez que lo entiendes, te das cuenta que PHP o ASP no estan inventando nada nuevo.
Te anexo un ejemplo del uso de WebAS aquí, es el que usa René en el demo de FastReport para Web (www.ciber-tec.d2g.com/frh/) :
Function WebInter()
PUBLIC oCgi, hIni, FrPrn
oCgi := TWCgi():New(Application:aArguments[1])
/* carga iniial de FastReports */
WITH OBJECT FrPrn := frReportManager():new()
:SetEventHandler("Report", "OnUserFunction", {|FName, FParams| CallUserFunction(FName, FParams)})
:AddFunction("function XBaseStr(nValue: Double, nLength: Variant = EmptyVar, nDecimals: Variant = EmptyVar): Variant","My Lovely Functions!", "It's a XBase Str() function!")
END
/* arrancamos el evalulador de WebAS +/
EVAL(cToBlock(oCgi:GetVarValue("func")))
oCgi:End()
RETURN Nil
FUNCTION Rep( nOption )
WITH OBJECT FrPrn
DO CASE
CASE nOption = 1
:SetWorkArea("Customers", 1)
:SetFieldAliases("Customers", "CUSTNO=Cust No;Company;ADDR1=Address;Phone;Fax;Contact")
:LoadFromFile(cRepsPath + "1.fr3")
CASE nOption = 2
:SetWorkArea("Customers", 1)
:SetFieldAliases("Customers", "CUSTNO=Cust No;Company;ADDR1=Address;Phone;Fax;Contact")
:LoadFromFile(cRepsPath + "2gr.fr3")
CASE nOption = 3 .OR. nOption = 4
Select Items
SET ORDER TO 2
*lShowCustName := .t.
:SetWorkArea("Customers", 1)
:SetFieldAliases("Customers", "CUSTNO=Cust No;Company;ADDR1=Address;Phone;Fax;Contact")
:SetWorkArea("Orders", 2)
:SetWorkArea("Items", 3)
:SetWorkArea("Parts", 4)
:SetMasterDetail("Customers", "Orders", {||Customer->CustNo})
:SetMasterDetail("Orders", "Items", {||Orders->OrderNo})
DbSetRelation(4, {||PartNo})
:SetResyncPair("Items", "Parts")
IF nOption = 3
:LoadFromFile(cRepsPath + "4.fr3")
ELSE
:LoadFromFile(cRepsPath + "md.fr3")
ENDIF
*lShowCustName := .f.
CASE nOption = 5
PRIVATE xx, aDir, I := 1, DirName := "C:\*.*"
aDir := Directory(DirName)
:SetUserDataSet("Dir", "F_NAME;F_SIZE;F_CREATION_DATE",;
{||I := 1}, {||I := I + 1}, ;
{||I := I - 1}, {||I > Len(aDir)},;
{|aField|xx := IF(aField="F_NAME",1, IF(aField="F_SIZE", 2, 3)) , aDir[I, xx]})
:LoadFromFile(cRepsPath + "6.fr3")
CASE nOption = 6
SELECT Items
SET ORDER TO 3
:SetUserDataSet("Parts in oders", "PartNo;Part;Total qty;Price",;
{|| Parts->( DbGoTop() )} ,;
{|| Parts->( DbSkip(1) )},;
{|| Parts->( DbSkip(-1) )},;
{|| Parts->( Eof() )},;
{|cField| GetDSValue(cField)})
:LoadFromFile(cRepsPath + "9.fr3")
CASE nOption = 7
:LoadFromFile( + "24.fr3")
:SetADOConnectPartStr("ADODatabase1", "Data Source", cDataPath + "demo.mdb")
CASE nOption = 8
:LoadFromFile(cRepsPath + "7.fr3") cRepsPath
:AddVariable("My Lovely Vars", "My and only my var", 10)
:AddVariable("My Lovely Vars", "test", 100.25)
:AddVariable("My Lovely Vars", "test1", "'Test'")
:AddVariable("My Lovely Vars", "test2", ctod("01/01/2007"))
ENDCASE
:PrepareReport()
* :SetProperty("Report", "ShowProgress", .f.)
:SetProperty("HTMLExport","ShowDialog",.F.)
:SetProperty("HTMLExport","OpenAfterExport",.F.)
:SetProperty("HTMLExport","Filename",cHtml+"prueba.htm")
:DoExport("HTMLExport")
:ClearDataSets()
Select Items
DbClearRelation()
OrdScope(0, nil)
OrdScope(1, nil)
END WITH
/* lee el archivo html que genera la salida */
cHtmlTemp := MemoRead(cHtml+"prueba.htm")
/* hay graficos en el reporte, tenemos que mover y remapear la salida web */
IF nOption = 7 // mover las graficas de lugar
/* remapeo de salida web para las graficas */
cHtmlTemp := STRTRAN(cHtmlTemp,"prueba.files","/frh/imgs")
/* mover las graficas a una carpeta visible desde la web */
aImgs := Directory(cHtml+"prueba.files\*.*")
FOR x := 1 to LEN(aImgs)
FileCopy(cHtml+"prueba.files\"+aImgs[x,1],cImgDir+aImgs[x,1])
NEXT
ENDIF
/* todo OK, ahora WebAS, haz tu trabajo:*/
oCgi:Say(cHtmlTemp) // salida directa a web.
RETURN Nil