FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour olesetproperty
Posts: 149
Joined: Thu Jun 21, 2007 03:26 PM
olesetproperty
Posted: Fri Aug 15, 2008 05:28 PM

Hola. Tengo una aplicacion donde necesito leer una base dbf, y mostrarla en excel. Usando los samples de fivewin (tengo harbour 803), pude hacerla sin problemas. Pero uno de los campos de la dbf, a pesar de ser texto, tiene valores "001","002", etc. y se muestran en la planilla excel como numericos, cosa que no me sirve. ¿tienen idea como puedo hacer para que en la planillita me aparezca "001", "002", etc... o sea, el tipo de dato que quiero, no me sirve transformarlo antes a mi, porque puedo tener valores "001", "002", pero tambien "T5079-P1".
¿Hay algun propiedad para establecer la celda con formato "texto"? color a la fuente, bold, etc, le pude poner, pero esto no. Gracias. Atte.

Posts: 149
Joined: Thu Jun 21, 2007 03:26 PM
Re: olesetproperty
Posted: Fri Aug 15, 2008 07:13 PM
diegopolverelli wrote:Hola. Tengo una aplicacion donde necesito leer una base dbf, y mostrarla en excel. Usando los samples de fivewin (tengo harbour 803), pude hacerla sin problemas. Despues tengo que tomar los datos modificados y validar algunas cosas. Pero si pongo un numero en una columna, no lo puedo recuperar. En realidad no puedo tratar el dato. ¿existe alguna funcion que me diga que tipo de dato es el que tengo? ej.: xart_codig=5 y despues como se si preguntar si xart_codig=0 o a "0" si que falle la aplicacion. Gracias.
Posts: 1054
Joined: Sun Oct 09, 2005 10:41 PM
olesetproperty
Posted: Fri Aug 15, 2008 08:08 PM

Hola,
se me ocurre que al ller el campo verifiques si es numerico o texto, si es texto le "sumas" un espacio a la variable leida

cDato :=_Field->campo

If VALTYPE(cdato) = "C"
cDato := " " + cDato
EndIF

...
..

Salu2

Posts: 149
Joined: Thu Jun 21, 2007 03:26 PM
olesetproperty
Posted: Fri Aug 15, 2008 08:45 PM

Espectacular. Mil gracias...!!!

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
olesetproperty
Posted: Sat Aug 16, 2008 06:28 AM

Diego,

Prueba con:

oHoja:Cells( ... ):NumberFormat := '@'

le indica que dichas celdas son tipo caracter

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 149
Joined: Thu Jun 21, 2007 03:26 PM
olesetproperty
Posted: Tue Aug 19, 2008 03:03 PM

Antonio, yo use un esquema similar a de los samples, utilizando OLESETPROPERTY y OLEGETPROPERTY. ¿como se puede invocar de la manera que me decis vos? tenes algun ejemplo. Te adjunto un codigo donde leo de una base y lleno una tabla xls.
Otra cosa, cuando la tabla es grande, por ej, 10000 reg. el proceso de llenar el .xls tarda muchisimo (10 /20 minutos) ¿que puede ser?
Gracias. Atte.

//---------------------
FUNCTION IMPO_LCOS(XLISPRE, odlg)

LOCAL oWnd, oOwc, hActiveWindow, nCounter, hsheet, x, cell, font, xfila, xfin, format
LOCAL XVERSION, xcompleta

// en la base ini guardo un parametro con la version del office
SELE 99
USE C:\TEMPO\INI SHARED
LOCA FOR INI->PARAMETRO='VERSION'
IF !EOF()
DO CASE
CASE VAL(LEFT(INI->VALOR,1))=1
XVERSION="OWC9.Spreadsheet"
CASE VAL(LEFT(INI->VALOR,1))=2
XVERSION="OWC10.Spreadsheet"
CASE VAL(LEFT(INI->VALOR,1))=3
XVERSION="OWC11.Spreadsheet"
CASE VAL(LEFT(INI->VALOR,1))=4
XVERSION="OWC12.Spreadsheet"
OTHERWISE
XVERSION="OWC"+ALLTRIM(SUBSTR(INI->VALOR,2,2))+".Spreadsheet"
ENDCASE
ELSE
XVERSION="OWC11.Spreadsheet"
ENDIF

SELE 99
USE

odlg:disable()

DEFINE WINDOW oWnd Title "IMPORTACION DE LISTA DE COSTOS "+alltrim(upper(xlispre))

@ 0, 0 ACTIVEX oOwc;
PROGID XVERSION

// PROGID "OWC10.Spreadsheet"

hActiveWindow = oOwc:GetProp( "ActiveWindow" )

OleSetProperty( hActiveWindow, "ColumnHeadings", 1, "Codigo" )
OleSetProperty( hActiveWindow, "ColumnHeadings", 2, "Descripcion" )
OleSetProperty( hActiveWindow, "ColumnHeadings", 3, "Precio" )

hSheet = oOwc:GetProp( "ActiveSheet" )

x:=1
sele 1
use &empre\costo.sx shared
COPY TO C:\TEMPO\TMPCOSTO FOR COSTO->CLI_LISPR=XLISPRE
USE C:\TEMPO\TMPCOSTO ALIAS COSTO

SELE 2
USE &EMPREST\ART.SX INDEX &EMPREST\ARTC SHARED

CURSORWAIT()

if msgyesno("Edita la lista de costos completa? (esta operacion tarda mas tiempo)","Atencion")
xcompleta=.t.
else
xcompleta=.f.
endif

SELE 1
INDEX ON COSTO->ART_CODIG TO C:\TEMPO\TMPART3
go top
do while !eof()
XART_CODIG:=COSTO->ART_CODIG
SELE 2
SET SOFTSEEK OFF
SEEK XART_CODIG
IF !EOF()
OleSetProperty( hActiveWindow, "RowHeadings", x, Str( x ) )
OleSetProperty( hSheet, "Cells", x, 1, "'"+XART_CODIG )
SELE 2
OleSetProperty( hSheet, "Cells", x, 2, ART->ART_DESCR )
SELE 1
OleSetProperty( hSheet, "Cells", x, 3, COSTO->PRECIO )
ENDIF
x:=x+1

    if xcompleta=.f. .and. x>10
            sele 1
            go bott
    endif

    sele 1
    skip

enddo

CURSORARROW()

// OleSetProperty( hActiveWindow, "ViewableRange", "A1:D6" )

hSheet = oOwc:GetProp( "ActiveSheet" )

oWnd:oClient = oOwc

ACTIVATE WINDOW oWnd valid VERIFICA(HSHEET,xlispre,odlg)

RETURN NIL

Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
olesetproperty
Posted: Tue Aug 19, 2008 04:07 PM

quetal diego, aqui un ejemplo , de crear una xls

por bloques, usando la class TExcelScript():New('Victor') y
TClipBoard():New() aunque tambien se puede con ELE directo.

nRow := 2
nStart := nRow
cMemo := ""

dbselectArea( cArtics )
dbgotop()
do while !eof()
cMemo += field->codigo
cMemo += chr(9)+field->alterno
cMemo += chr(9)+field->unidad
cMemo += chr(9)+field->nombre
cMemo += CRLF

     if len(cMemo) >= 20000 .or. eof()

      oClip := TClipBoard():New()
      oClip:Clear()
      oClip:SetText( cMemo )
      cCell := "A" + Alltrim( Str( nStart ) )
      oRange := oExcel:oSheet:Range( cCell )
      oRange:Select()
      oExcel:oSheet:Paste()
      oClip:End()

      nStart := nRow

      cMemo := ""
  endif



sysrefresh()
dbselectArea(cArtics )
dbskip()

enddo

saludos.. Cesar C.C.

Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
olesetproperty
Posted: Tue Aug 19, 2008 04:31 PM

Diego,

Es preferible usar la clase TOleAuto de Harbour/xHarbour cuando tienes que acceder a ese tipo de datos. El código es más simple.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 149
Joined: Thu Jun 21, 2007 03:26 PM
olesetproperty
Posted: Tue Aug 19, 2008 05:18 PM
disculpá mi ignorancia... ¿que es TOLEAuto? ¿hay algun ejemplito en SAMPLES de esto que me propones? con el excel.prg y excel2.prg arme lo que postié, y lento, pero camina... que es TOleAuto. ¿yo en que hice lo que subi? ¿el ejemplo que subio que decia TOle "Victor", o algo asi, es lo mismo que propones vos?
Gracias!!!


Antonio Linares wrote:Diego,

Es preferible usar la clase TOleAuto de Harbour/xHarbour cuando tienes que acceder a ese tipo de datos. El código es más simple.
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
olesetproperty
Posted: Tue Aug 19, 2008 05:29 PM
Diego,

Busca en estos foros por CreateObject ó por TOleAuto. Hay muchos ejemplos.

Aqui tienes un ejemplo de Enrico:
FUNCTION MAIN() 

    LOCAL oExcel := CREATEOBJECT( "Excel.Application" ) 

    LOCAL oSheet 

    oExcel:WorkBooks:Open( "E:\XHARBOUR\TEST.XLS" ) 

    oSheet = oExcel:ActiveSheet 

    ? oSheet:Cells( 1, 1 ):Value 
    ? oSheet:Cells( 2, 1 ):Value 
    ? oSheet:Cells( 3, 1 ):Value 

    ? oSheet:Range( "A1" ):Value 

    oExcel:Quit() 

    RETURN NIL

En cuanto a que es el TOleAuto, revisa esto:
http://en.wikipedia.org/wiki/OLE_Automation
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 149
Joined: Thu Jun 21, 2007 03:26 PM
olesetproperty
Posted: Tue Aug 19, 2008 06:17 PM
disculpame, Antonio... busque y busque ademas "CreateObject" e "Include", pero siempre veo ejemplos donde lo unique que tienen en la cabecera es fivewin.ch.
Cuando copio lo que me mandaste me da el error de que no existe la funcion:

Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_HB_FUN_CREATEOBJECT' referenced from C:\FW192\SAROS
SX\F_EXCEL.OBJ
* There are errors


donde esta createobject???

¿para que me funcione lo que me pasaste, el ejemplito, que tengo que agregar??? despues yo investigo y lo saco. Gracias y disculpa... CHAU...!!!

Antonio Linares wrote:Diego,

Busca en estos foros por CreateObject ó por TOleAuto. Hay muchos ejemplos.

Aqui tienes un ejemplo de Enrico:
FUNCTION MAIN() 

    LOCAL oExcel := CREATEOBJECT( "Excel.Application" ) 

    LOCAL oSheet 

    oExcel:WorkBooks:Open( "E:\XHARBOUR\TEST.XLS" ) 

    oSheet = oExcel:ActiveSheet 

    ? oSheet:Cells( 1, 1 ):Value 
    ? oSheet:Cells( 2, 1 ):Value 
    ? oSheet:Cells( 3, 1 ):Value 

    ? oSheet:Range( "A1" ):Value 

    oExcel:Quit() 

    RETURN NIL

En cuanto a que es el TOleAuto, revisa esto:
http://en.wikipedia.org/wiki/OLE_Automation
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
olesetproperty
Posted: Wed Aug 20, 2008 08:06 AM

Diego,

> C:\FW192\SAROSSX\F_EXCEL.OBJ

Estas usando la versión 1.92 de FiveWin ???

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 149
Joined: Thu Jun 21, 2007 03:26 PM
olesetproperty
Posted: Wed Aug 20, 2008 12:27 PM
No, tengo fwh 803. Igual ya lo pude usar. Gracias...!!!

Antonio Linares wrote:Diego,

> C:\FW192\SAROSSX\F_EXCEL.OBJ

Estas usando la versión 1.92 de FiveWin ???

Continue the discussion