Página 1 de 1

Copiar Consulta a Excel

NotaPublicado: Jue Mar 17, 2011 3:34 pm
por Rolin33
Saludos, trabajo con Plex 5.0 y 6.1, alguien podria informarme como puedo copiar toda la informacion de una consulta de mi sistema a Excel mediante un boton, o donde puedo encontrar ayuda sobre este tema.
Gracias.

NotaPublicado: Vie Mar 18, 2011 9:27 am
por pacopicon
Hola:

Lo puedes hacer con VBScript. Aunque es cógido independiente de Plex, lo puedes meter dentro de la función Plex. En internet podrás encontrar ejemplos de como recuperar los datos y pasarlos a Excel.

Saludos,

NotaPublicado: Vie Mar 18, 2011 10:06 am
por Rieke
Hola Plexeros!!!
Tambien lo puedes hacer a traves de Crystal Report, te creas el informe con esta herramienta y luego llamar al informe desde plex. Para llamarlo tambien necesitad algo de Visual Basic Script, pero te ahorras todo el engorro de tratar los datos con el VBS.

NotaPublicado: Mar Mar 22, 2011 7:28 pm
por Rolin33
Hola a todos nuevamente, logre hacer un source code que me captura lo que hay en el portapaleles y lo pasa a excel. Ahora estoy en otro source code que me graba mi grid al portapapeles, pero al compilar me sale el siguiente error:
D:\APP600\LOC600\BKGEN\CTCIAMUI.CPP(1807) : error C2065: 'colCount' : undeclared identifier
D:\APP600\LOC600\BKGEN\CTCIAMUI.CPP(1811) : error C2374: 'i' : redefinition; multiple initialization
D:\APP600\LOC600\BKGEN\CTCIAMUI.CPP(1799) : see declaration of 'i'
Error executing cl.exe.

El source code es el siguiente:
{
HWND hwndGrid=ObPanelAPI::GetControlHandleByName(&(1:));
if (hwndGrid)
{
CString text;

//Send message to select all the loaded Rows
//Get the number of rows loaded on the Grid
int iRows = SendMessage(hwndGrid, HGM_GETROWCOUNT, 0, 0L);
for(int i=0;i<iRows;i++)
{
//Send message to select the gridrow
SendMessage(hwndGrid,HGM_TURNONROW,i,0);
}


//Create a array of int values to hold the Columns and set to lpMap
int *lpMap = new int[colCount];
SendMessage(hwndGrid,HGM_GETCOLMAP,0,((LPARAM)lpMap));


for(int i=0;i<colCount;i++)
{
CString str1;
int m;
for(m=0;m<colCount;m++)
{
if(lpMap[m] == i)
{
break;
}
}

WORD wState = SendMessage(hwndGrid,HGFM_GETSTATE,m,0L);
if(wState != 5) //If state is not hidden
{
char* str = new char[100];
if((int)SendMessage(hwndGrid,HGFM_GETNAME,m,(LPARAM)str)) //Get the name of the Column
{
str1 = CString(str);
if(text.GetLength() > 0)
text += "\t"+str1; //Append the column name to the exisiting set with tab as delimiter
else
text = str1;
}
else
break;
delete str; //delete the memory allocated before.
}
}

delete lpMap; //delete the memory allocated before

text += "\r\n"; //delimit the header with the carriage return.

//Send message to select all the loaded Rows in the Grid CNTRL+SHIFT+END
SendMessage( hwndGrid, WM_KEYDOWN, VK_CONTROL, 1L);
SendMessage( hwndGrid, WM_KEYDOWN, VK_SHIFT, 1L);
SendMessage( hwndGrid, WM_KEYDOWN, VK_END, 1L);

SendMessage( hwndGrid, WM_COPY, NULL, NULL ); //Process the CNTR+C to get the values to clipboard for the grid

HGLOBAL hMem;
char * MemStr;

CWnd *pWnd = ObPanelAPI::GetPanelCWndByName("*Current");
if (pWnd)
{
if ( pWnd -> OpenClipboard() )
{
char* buffer = (char*)GetClipboardData(CF_TEXT);
CString temp(buffer);
text += temp;

if ( EmptyClipboard() )
{
// Allocate global memory for string
hMem = GlobalAlloc(GMEM_DDESHARE, text.GetLength()+1);
MemStr = (char*)GlobalLock(hMem);
strcpy(MemStr, text);
GlobalUnlock ( hMem);
// The Clipboard now owns the allocated memory
// and will delete this data object
// when new data is put on the Clipboard
if ( !SetClipboardData(CF_TEXT, hMem) )
GlobalFree( hMem);
}
else
MessageBox (0, text, "Clipboard Empty Error", MB_OK);
CloseClipboard();
}
}
}
}

Ojala alguien pueda ayudarme, saludos.

NotaPublicado: Mié Mar 23, 2011 9:30 am
por Jorge Ubeda
colCount no está definido. Se usa directamente. Debes definirlo primero.
i está declarado dos veces como int : for(int i=0;i<iRows;i++)
Los números de línea te dirán exactamente, en tu cpp, dónde está el problema.

NotaPublicado: Jue Abr 07, 2011 1:38 am
por Rolin33
Ok, gracias a todos.
Saludos.

NotaPublicado: Jue May 09, 2013 8:17 pm
por fenixo69
al final te funciono rolin? ya que yo no logro solucionarlo... :?

NotaPublicado: Mar May 14, 2013 3:40 pm
por Rolin33
Hola Fenixo69 aun no logro que me funcione, si logro solucionarlo te aviso para asi compartirlo con las demas personas del foro si se les llegara a presentar el mismo caso. Saludos y si tienes avances por favor me avisas, saludos compañero.

cambiar la estrategia (menos c++)

NotaPublicado: Mar May 14, 2013 7:37 pm
por Jorge Ubeda
Hola Rolin, Fenix
Digamos que si dos años después sigue sin resolver, habría que cambiar de estrategia... ;-)
Paco recomienda usar vBscript. Habría que estudiarlo. Por mi parte usé tu método, pero muy simplificado. Fundamentalmente, todo el tratamiento de strings lo dejé en Plex ¿para qué complicarme la vida con algo que Plex tiene resuelto, y bien?. Sólo usé cinco APIs insertadas en el loop de recorrido de los datos: una para abrir el clipboard (OpenClipboard()), una para limpiarlo (EmptyClipboard()), otra para guardar (SetClipboardData()), otra más para obtener el contenido (GetClipboardData()), y la última para eliminar el espacio de memoria (CloseClipboard()). Por supuesto, con todas las medidas necesarias alrededor para manipular memoria y errores, e intercambio de tipos de datos.
Recuerden que las APIs de un lenguaje determinado pueden insertarse como APIs en la lógica de la función, porque forman, en cierto modo, un contiguo.

NotaPublicado: Vie Jun 07, 2013 3:39 pm
por fenixo69
Hola Jorge,
Muchas gracias segui tu consejo y con ayuda de la wiki de plex para complementar y tuve los resultados deseados,

Saludos.

Leroy.