olesetproperty

olesetproperty

Postby diegopolverelli » Fri Aug 15, 2008 5: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.
diegopolverelli
 
Posts: 149
Joined: Thu Jun 21, 2007 3:26 pm

Re: olesetproperty

Postby diegopolverelli » Fri Aug 15, 2008 7: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.
diegopolverelli
 
Posts: 149
Joined: Thu Jun 21, 2007 3:26 pm

Postby Willi Quintana » Fri Aug 15, 2008 8: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
User avatar
Willi Quintana
 
Posts: 1022
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Postby diegopolverelli » Fri Aug 15, 2008 8:45 pm

Espectacular. Mil gracias...!!!
diegopolverelli
 
Posts: 149
Joined: Thu Jun 21, 2007 3:26 pm

Postby Antonio Linares » Sat Aug 16, 2008 6:28 am

Diego,

Prueba con:

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

le indica que dichas celdas son tipo caracter
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42161
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby diegopolverelli » Tue Aug 19, 2008 3: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
diegopolverelli
 
Posts: 149
Joined: Thu Jun 21, 2007 3:26 pm

Postby sysctrl2 » Tue Aug 19, 2008 4: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 "
User avatar
sysctrl2
 
Posts: 1027
Joined: Mon Feb 05, 2007 7:15 pm

Postby Antonio Linares » Tue Aug 19, 2008 4: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42161
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby diegopolverelli » Tue Aug 19, 2008 5: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.
diegopolverelli
 
Posts: 149
Joined: Thu Jun 21, 2007 3:26 pm

Postby Antonio Linares » Tue Aug 19, 2008 5:29 pm

Diego,

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

Aqui tienes un ejemplo de Enrico:
Code: Select all  Expand view  RUN
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
User avatar
Antonio Linares
Site Admin
 
Posts: 42161
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby diegopolverelli » Tue Aug 19, 2008 6: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:
Code: Select all  Expand view  RUN
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
diegopolverelli
 
Posts: 149
Joined: Thu Jun 21, 2007 3:26 pm

Postby Antonio Linares » Wed Aug 20, 2008 8: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42161
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby diegopolverelli » 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 ???
diegopolverelli
 
Posts: 149
Joined: Thu Jun 21, 2007 3:26 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 45 guests