none
Como exportar por codigo sql a EXCEL?

    Question

  • Holas

    tengo que traer data de un reporte,y exportarlo a excel,quisiera hacerlo x sql,porque pareciera mas rapido....hay manera de hacerla mediante algun codigo de sql server?

     


    Estudiante_Sistemas
    Wednesday, November 03, 2010 11:47 PM

Answers

  • Saludos, Para exportar datos desde SQL Server a Excel puedes hacerlo en 3 formas:

    1. Utilizando el Winzard haciendo clic derecho en la base de datos y luego Task y en Exportar.

    2. Utilizando SQL Server Data Transformation Services (DTS) con Integration Services

    3. Utilizando el código siguiente:

    INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=c:\testing.xls;',
    'SELECT <campo1>, <campo2>, <campo3> FROM [Sheet1$]')
    SELECT <campo1>, <campo2>, <campo3>
    FROM <Tabla>
    GO


    Antes de correr el código anterior, debes activar "Ad Hoc Distributed Queries", utilizando este código:

     

    exec sp_configure 'Show Advanced Options', 1
    GO
    
    reconfigure
    Go
    
    exec sp_configure 'Ad Hoc Distributed Queries', 1
    GO
    
    reconfigure
    Go
    

    Espero que te sirva.


    Willy Taveras.-
    Thursday, November 04, 2010 3:15 AM
    Moderator
  • Hola.

    Depende de lo pesado o grande que sea la consulta que te devuelve el report, y quién y cómo se obtiene, pero en general, te recomiendo que utilices Integration Services para ello. Sobre este caso general, aquí tienes una guía: http://searchsqlserver.techtarget.com/tutorial/Export-SQL-Server-data-to-an-Excel-file-using-SSIS-and-Visual-Studio.

    En cualquier caso, danos más datos acerca de lo que ha de ser exportado a Excel, quien y cómo se hace para que podamos darte una orientación más precisa. Indícanos también qué versión y edición de SQL Server utilizas.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Thursday, November 04, 2010 1:12 PM
    Moderator
  • al final solucione mi problema

    con el codigo q me dieron arriba insertaba,el resto esta en VB.NET

    dejo mi codigo:

     

     'Reporte de la última gestión
      Private Sub PrintRecordUltimaGestion()
        Dim dtsReporte As New DataSet
        Dim objExcel As New ClassExcel
        Dim xlsApp As excel.ApplicationClass
        Dim xlsWB As excel.WorkbookClass
        xlsApp = New excel.ApplicationClass
        sfd.InitialDirectory = "C:\"
        sfd.DefaultExt = ".xls"
        sfd.Filter = "Archivos Excel (.xls)|*.xls"
        Dim result As Boolean = sfd.ShowDialog()
        ' Process open file dialog box results
        If result = True Then
          'Creando una copia de la plantilla en el servidor, este caso local
          Dim sArchivoOrigen As String = "\\IP\Exceles\plantilla.xls" '"C:\Exceles\plantilla.xls"
          Dim sRutaDestino As String = "\\IP\Exceles\reporte.xls" '"C:\Exceles\reporte.xls"
          My.Computer.FileSystem.CopyFile(sArchivoOrigen, _
                        sRutaDestino, _
                        True)
          'Devuelve la cantidad de filas
          Dim inx As Integer
          bta.IntCarMes = IntIdCarMesResultado
          If lTotalFlas.RetornaIntFilas(bta) Then
            inx = bta.IntFilas
          End If
          If inx = 0 Then
            MsgBox("No existen datos para generar el reporte.", MessageBoxIcon.Information, "Cescont SAC")
            Exit Sub
          Else
            'Chapando el origen, local en este caso
            sArchivoOrigen = "\\IP\Exceles\reporte.xls" '"C:\Exceles\reporte.xls"
            'Y moviendo archivo al cliente
            sRutaDestino = sfd.FileName '"C:\reporte" & Today().Day & Today.Month & Today.Year & ".xls"
    
            My.Computer.FileSystem.MoveFile(sArchivoOrigen, _
                          sRutaDestino, _
                          True)
    
            If inx > 0 Then
              MsgBox("Se genero el reporte", MsgBoxStyle.Information, sTit)
              xlsWB = xlsApp.Workbooks.Open(sRutaDestino)
              xlsApp.Visible = True
              xlsApp.Range(xlsApp.Cells(2, 1), xlsApp.Cells(inx + 1, 35)).Select()
              xlsApp.Selection.Borders.ColorIndex = enuCOLORESEXCELL.Negro
              xlsApp.Selection.Font.Bold = False
              'xlsApp.Selection.Interior = enuCOLORESEXCELL.Blanco
    
            End If
          End If
        End If
        xlsApp = Nothing
      End Sub

     

    Espero le ayude a otros

    Gracias.

    Slds.


    Estudiante_Sistemas
    • Marked as answer by Rosita_Lima Friday, November 12, 2010 9:13 PM
    Friday, November 12, 2010 9:12 PM

All replies

  • Saludos, Para exportar datos desde SQL Server a Excel puedes hacerlo en 3 formas:

    1. Utilizando el Winzard haciendo clic derecho en la base de datos y luego Task y en Exportar.

    2. Utilizando SQL Server Data Transformation Services (DTS) con Integration Services

    3. Utilizando el código siguiente:

    INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=c:\testing.xls;',
    'SELECT <campo1>, <campo2>, <campo3> FROM [Sheet1$]')
    SELECT <campo1>, <campo2>, <campo3>
    FROM <Tabla>
    GO


    Antes de correr el código anterior, debes activar "Ad Hoc Distributed Queries", utilizando este código:

     

    exec sp_configure 'Show Advanced Options', 1
    GO
    
    reconfigure
    Go
    
    exec sp_configure 'Ad Hoc Distributed Queries', 1
    GO
    
    reconfigure
    Go
    

    Espero que te sirva.


    Willy Taveras.-
    Thursday, November 04, 2010 3:15 AM
    Moderator
  • Hola.

    Depende de lo pesado o grande que sea la consulta que te devuelve el report, y quién y cómo se obtiene, pero en general, te recomiendo que utilices Integration Services para ello. Sobre este caso general, aquí tienes una guía: http://searchsqlserver.techtarget.com/tutorial/Export-SQL-Server-data-to-an-Excel-file-using-SSIS-and-Visual-Studio.

    En cualquier caso, danos más datos acerca de lo que ha de ser exportado a Excel, quien y cómo se hace para que podamos darte una orientación más precisa. Indícanos también qué versión y edición de SQL Server utilizas.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Thursday, November 04, 2010 1:12 PM
    Moderator
  • Aquí te dejo la opción no.2  que indique en el post anterior, este es un ejemplo de creación de DTS que tengo en mi página (las explicaciones son en español).

     

    Visita: http://itlearn.net/sql02.aspx

     

    Espero que te sirva.


    Willy Taveras.-
    Thursday, November 04, 2010 5:13 PM
    Moderator
  • Holas

    bueno este es la consulta que quiero exportar a excel

    ALTER PROCEDURE  [dbo].[Reporte_Xls_SGC0002] --88
    @IntCarMes INT   
    AS
    SET DATEFORMAT DMY           
    SELECT  distinct c.VarNumIdent AS DNI, c.VarNomClient AS Cliente, dbo.Ubicable(cc.IntIdClient) AS Ubicable
    ,  cc.VarCondLab AS [CondiciónLaboral], cc.VarNumCuent as [NúmerodeCuenta], cc.VarNomProd as [Producto], 
               cc.VarFechaCas as [FechadeCastigo], cc.MonSalProd as[MontoSaldoProducto] , cc.MonCapProd as[MontoCapitalProducto] , cc.VarCampDes [CampanaDescuento], cc.MonPorCancel[MontoPorCancelar], cc.VarMoneda [TipoMoneda]
               , dbo.Gest_Fecha(cc.IntCarMes, c.IntIdClient,cc.VarNumCuent) AS 'FechaGestion'
               , ISNULL(c.VarTel01, cc.VarTel01) AS Telefono1, 
               ISNULL(ISNULL(c.VarTel02, cc.VarTel02),'0') AS Telefono2, ISNULL(c.VarTel03, cc.VarTel03) AS Telefono3, ISNULL(c.VarTel04, cc.VarTel04) AS Telefono4, 
               ISNULL(c.VarTel05, cc.VarTel05) AS Telefono5, ISNULL(c.Varcelular, cc.VarCelular) AS Celular, ISNULL(c.VarOpeCel, cc.VarOpeCel) AS OperadorCel1, 
               ISNULL(c.varcelular2, cc.VarCelular2) AS Celular2, ISNULL(c.VarOpeCel2, cc.VarOpeCel2) AS OperadorCel2, ISNULL(c.VarDirecClient, cc.VarDirClient) 
               AS DireccionCliente, ISNULL(dbo.Distrito(c.IntIdDist), dbo.Distrito(cc.IntIdDist)) AS Distrito, ISNULL(dbo.Provincia(c.IntIdDist), dbo.Provincia(cc.IntIdDist)) 
               AS Provincia, ISNULL(dbo.Departamento(c.IntIdDist), dbo.Departamento(cc.IntIdDist)) AS Departamento, ISNULL(c.VarNomEmp, cc.VarNomEmp) 
               AS EmpresaNombre, ISNULL(dbo.Distrito(c.IntIdDistEmp), dbo.Distrito(cc.IntIdDistEmp)) AS DistritoEmpresa, ISNULL(dbo.Provincia(c.IntIdDistEmp), 
               dbo.Provincia(cc.IntIdDistEmp)) AS EmpresaProvincia, ISNULL(dbo.Departamento(c.IntIdDistEmp), dbo.Departamento(cc.IntIdDistEmp)) 
               AS DepartamentoEmpres
               , dbo.Gest_Gestor(cc.IntCarMes, cc.IntIdClient, cc.VarNumCuent) AS Gestor
               , dbo.Gest_Aquien(cc.IntCarMes, cc.IntIdClient,cc.VarNumCuent) AS Calificacion
               , dbo.Gest_Respu(cc.IntCarMes, cc.IntIdClient, cc.VarNumCuent) AS Respuesta, dbo.Gest_FechaProm(cc.IntCarMes, 
               cc.IntIdClient, cc.VarNumCuent) AS FechaPromesa, dbo.Gest_OBS(cc.IntCarMes, cc.IntIdClient, cc.VarNumCuent) AS Observacion
    FROM     dbo.Tbl_CarteraCliente AS cc INNER JOIN
               dbo.Tbl_ClientePersona AS c ON c.IntIdClient = cc.IntIdClient
                
               INNER JOIN Tbl_CarteraMes CM
    ON CM.IdCarMes=cc.IntCarMes  
    INNER JOIN Tbl_Cartera Car 
    ON Car.IntIdCar=CM.IntIdCar 
    WHERE (cc.IntCarMes=@IntCarMes)  
     --AND dbo.Gest_Aquien(cc.IntCarMes, c.IntIdClient,cc.VarNumCuent)IS  NULL  
    ORDER BY VarNomClient ASC
    


    Estudiante_Sistemas
    Thursday, November 04, 2010 8:25 PM
  • Hola.

    ¿Cuánto tarda en ejecutarse? ¿Cuántos registros devuelve? ¿Cómo se debe ejecutar (una aplicación, un proceso batch)?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Thursday, November 04, 2010 9:02 PM
    Moderator
  • Hola.

    ¿Cuánto tarda en ejecutarse? ¿Cuántos registros devuelve? ¿Cómo se debe ejecutar (una aplicación, un proceso batch)?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/


    Hola

    Demora 22 segundos..en ejecutarse

    devuelve un promedio de 8 mil registros


    Estudiante_Sistemas
    Thursday, November 04, 2010 11:28 PM
  • Hola.

    ¿Y con respecto al modo de ejecución?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Friday, November 05, 2010 8:03 AM
    Moderator
  •  

    Hola

     

    ¿ Has podido solucionar tu problema ?

     

    Saludos


    Eduardo Portescheller
    Friday, November 05, 2010 12:27 PM
    Owner
  • Rosita,


    Puedes desarrollar un Integration Services Package, utilizando Variables puedes pasar por parámetro el valor que pasas en el procedimiento (@IntCarMes), para configurar esto solo tienes que seguir los pasos que se indican en esta página:

    http://www.texastoo.com/post/2009/03/24/Use-variables-in-the-SSIS-Data-Flow-tab.aspx


    Entonces creas un procedimiento para pasar los valores de los parametros mas o menos como el que indico en esta página:

    http://itlearn.net/sql03.aspx

    Cuando agregues el  [ADO NET Source].[SqlCommand] Expression del ADO.NET Source (como indica el primer link), solo tienes que poner:

    Donde la variable parametro es la que configuraras (con cualquier nombre) y pasaras a través del procedimiento que indico en el segundo Link.

     

    "EXEC [dbo].[Reporte_Xls_SGC0002] '" + @[User::parametro] + "'"
    

     


    Willy Taveras.-
    Friday, November 05, 2010 2:45 PM
    Moderator
  • Rosita,


    Puedes desarrollar un Integration Services Package, utilizando Variables puedes pasar por parámetro el valor que pasas en el procedimiento (@IntCarMes), para configurar esto solo tienes que seguir los pasos que se indican en esta página:

    http://www.texastoo.com/post/2009/03/24/Use-variables-in-the-SSIS-Data-Flow-tab.aspx


    Entonces creas un procedimiento para pasar los valores de los parametros mas o menos como el que indico en esta página:

    http://itlearn.net/sql03.aspx

    Cuando agregues el  [ADO NET Source].[SqlCommand] Expression del ADO.NET Source (como indica el primer link), solo tienes que poner:

    Donde la variable parametro es la que configuraras (con cualquier nombre) y pasaras a través del procedimiento que indico en el segundo Link.

     

    "EXEC [dbo].[Reporte_Xls_SGC0002] '"
     + @[User::parametro] + "'"
    
    

     


    Willy Taveras.-


    No aun no lo resuelvo

    MMM no entiendo muy bien esta pagina...

    segun veo es para pasar un paramento al sql server business iteligence???

     


    Estudiante_Sistemas
    Friday, November 05, 2010 4:43 PM
  •  

    Aquí encontrará un gran tutorial sobre este tema, utilizando el SSIS y Visual Studio

    Revisa el link:

    http://searchsqlserver.techtarget.com/tutorial/Export-SQL-Server-data-to-an-Excel-file-using-SSIS-and-Visual-Studio

    Saludos

     


    Eduardo Portescheller
    Tuesday, November 09, 2010 12:25 PM
    Owner
  • Aquí te dejo la opción no.2  que indique en el post anterior, este es un ejemplo de creación de DTS que tengo en mi página (las explicaciones son en español).

     

    Visita: http://itlearn.net/sql02.aspx

     

    Espero que te sirva.


    Willy Taveras.-


    Hola

    sabes me pierdo en el punto 8

    hacemos clicl en el punto"ADO NET SOURCE",nunca lo encuentro y no me sale tal y cual se ve en la imagen :S


    Estudiante_Sistemas
    Tuesday, November 09, 2010 3:41 PM
  • Hola.

    Para ofrecerte una alternativa, ¿podrías indicar cómo ha de ser ejecutada la generación del fichero Excel? ¿Quién lo lanza y desde dónde? ¿Es un proceso desconectado o la respuesta a la acción de un usuario?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Tuesday, November 09, 2010 3:46 PM
    Moderator
  • Aquí te dejo la opción no.2  que indique en el post anterior, este es un ejemplo de creación de DTS que tengo en mi página (las explicaciones son en español).

     

    Visita: http://itlearn.net/sql02.aspx

     

    Espero que te sirva.


    Willy Taveras.-


    Hola

    sabes me pierdo en el punto 8

    hacemos clicl en el punto"ADO NET SOURCE",nunca lo encuentro y no me sale tal y cual se ve en la imagen :S


    Estudiante_Sistemas


    Saludos,

    He modificado el post, ahora incluyo la parte donde arrastramos los componentes para utilizarlos.

    Espero que te sirva.

    Willy Taveras.-

    http://itlearn.net


    Hola ,

    Gracias,pero ahora me quede en el punto 17,no logra ubicar execute package utility,no logra ubicarlo ....para poder ejcutarlo..puedes especificar donde,hacer clic,ps q raro no lo encuentro


    Estudiante_Sistemas
    Tuesday, November 09, 2010 4:49 PM
  • Hola willy taveras

    bueno ya me di cuenta que si funcionaba,pero,lo que paso,es que no abre el excel cuando eejcuta,solo me doy cuenta x los colores,y veo mi arxivo y si,ahi estaban los datos y puedo ver que es rapidisimo,pero mi "problema"

    es que yo tengo un formulario de reportes:

    Uno de ellos,debo sacar el stored de arriba

    ya me di cuenta que funciona pero debo hacerlo con formulario de windows hay alguna opcion de hacer eso??

    Gracias a todos


    Estudiante_Sistemas
    Tuesday, November 09, 2010 5:21 PM
  • Hola willy taveras

    bueno ya me di cuenta que si funcionaba,pero,lo que paso,es que no abre el excel cuando eejcuta,solo me doy cuenta x los colores,y veo mi arxivo y si,ahi estaban los datos y puedo ver que es rapidisimo,pero mi "problema"

    es que yo tengo un formulario de reportes:

    Uno de ellos,debo sacar el stored de arriba

    ya me di cuenta que funciona pero debo hacerlo con formulario de windows hay alguna opcion de hacer eso??

    Gracias a todos


    Estudiante_Sistemas

    Cuando dices "hacerlo con un formulario de windows", ¿a qué te refieres?

    En el caso de que sea que esto lo tienes que invocar desde un formulario, solo tienes que crear el formulario e invocar el Stored Procedure que indico en el segundo link (http://itlearn.net/sql03.aspx ) pasandole el parametro que le configuras de la ubicacion del archivo Excel y del Integration Services Package.

    Y si lo que deseas es visualizar un progreso del proceso, esto no es posible utilizando procedimientos porque no se puede determinar cuanto va a tardar. Existe una visualzación de Progress Bar que permite simular un proceso en corrida, que es utilizando el estilo  Marquee .

    Espero que te sirva.

    Willy Taveras.-

    http://itlearn.net


    Primero,gracias x responder,ahora,te comento,trabajo en .net con sql server 2008,tengo un formulario de reportes,y uno de ellos,debiera exportarlo la data de un stored que recibe un parametro,yo lo tenia hecho pero DEMORA,porque recorre fila x fila y aparte lo dibuja en excel,esto es usando solo windows form en uan clase excel,la cual me demora como 15 minutios,y e s tored solo demora 22segundos,como que mucho :S

    Por eso pense hacerlo x sql pero no entiendo como puedo hacer....

    porque se que es mas rapido,pense en un stored que lo imprima,

    xq con el ejemplo que me ayduaste,solo para ver q imprimio tuve q abrir la ybicacion y verlo ahi,

    mis dudas son si puedo crear un solo stored que me permita mandando mi parametro abrir el excel que carga??

    Slds.


    Estudiante_Sistemas
    Tuesday, November 09, 2010 5:34 PM
  • Hola willy taveras

    bueno ya me di cuenta que si funcionaba,pero,lo que paso,es que no abre el excel cuando eejcuta,solo me doy cuenta x los colores,y veo mi arxivo y si,ahi estaban los datos y puedo ver que es rapidisimo,pero mi "problema"

    es que yo tengo un formulario de reportes:

    Uno de ellos,debo sacar el stored de arriba

    ya me di cuenta que funciona pero debo hacerlo con formulario de windows hay alguna opcion de hacer eso??

    Gracias a todos


    Estudiante_Sistemas

    Cuando dices "hacerlo con un formulario de windows", ¿a qué te refieres?

    En el caso de que sea que esto lo tienes que invocar desde un formulario, solo tienes que crear el formulario e invocar el Stored Procedure que indico en el segundo link (http://itlearn.net/sql03.aspx ) pasandole el parametro que le configuras de la ubicacion del archivo Excel y del Integration Services Package.

    Y si lo que deseas es visualizar un progreso del proceso, esto no es posible utilizando procedimientos porque no se puede determinar cuanto va a tardar. Existe una visualzación de Progress Bar que permite simular un proceso en corrida, que es utilizando el estilo  Marquee .

    Espero que te sirva.

    Willy Taveras.-

    http://itlearn.net


    Primero,gracias x responder,ahora,te comento,trabajo en .net con sql server 2008,tengo un formulario de reportes,y uno de ellos,debiera exportarlo la data de un stored que recibe un parametro,yo lo tenia hecho pero DEMORA,porque recorre fila x fila y aparte lo dibuja en excel,esto es usando solo windows form en uan clase excel,la cual me demora como 15 minutios,y e s tored solo demora 22segundos,como que mucho :S

    Por eso pense hacerlo x sql pero no entiendo como puedo hacer....

    porque se que es mas rapido,pense en un stored que lo imprima,

    xq con el ejemplo que me ayduaste,solo para ver q imprimio tuve q abrir la ybicacion y verlo ahi,

    mis dudas son si puedo crear un solo stored que me permita mandando mi parametro abrir el excel que carga??

    Slds.


    Estudiante_Sistemas


    Lo que puedes hacer es en tu formulario donde enviaras los parametros del Documento Excel que utilizaras para ingresar los datos exportados desde SQL Server, entonces utilizar:


    Suponiendo que tu aplicación es en C# . NET

                var process = new Process();

                    try
                    {
                        process.StartInfo.FileName = <ruta_archivo_excel_especificado>;
                        process.Start();
                        process.Close();

                   } Catch(Exception ex)


    Con esto lo que haras es abrir el documento que acabas de procesar automaticamente despues de finalizar el proceso.


    Willy Taveras.-

    http://itlearn.net


    Hola

    bueno no trabajo con c#,tampoco asp.net sino aplicacion de windows,

    como seria de la otra forma?en aplicacionde escritorio de windows?

    pero al final me llegara abrir el excel,o solo lo exporta pero lo dejaen laubicacion?

    Muachas gracias


    Estudiante_Sistemas
    Tuesday, November 09, 2010 6:02 PM
  • Una aplicación de Windows debe trabajar con algun lenguaje ya sea: VB.NET, C#, etc... Pero debes estar trabajando bajo un lenguaje.


    Cuando termine el proceso lo que haria es abrir el archivo de excel que recibio la exportación y no lo elimina de la ubicación donde lo creas. Solo lo abre.

     

    Si la aplicación es en VB, entonces puedes utilizar el siguiente código:

    Imports Excel.WorkbookClass
    
    Imports Excel.WorksheetClass
    
    Imports Excel.ApplicationClass
    
    
    
    Dim xlsApp As Excel.ApplicationClass
    
    Dim xlsWB As Excel.WorkbookClass
    
    
    
    xlsApp = New Excel.ApplicationClass
    
    xlsApp.Visible = True
    
    xlsWB = xlsApp.Workbooks.Open("C:\test1.xls")
    
    

    Donde esta test1.xls indicarias el nombre del archivo que utilizaras tu.

     


    Willy Taveras.-

    http://itlearn.net


    SI trabajo con VB.NET,ya veo uso eso para abrirlo,bueno para matar el excel si tengo un codigo.

    PROBE ESTE CODIGO PERO ME SALE UN ERROR,APESAR DE HABER CORRIDO LOS EXEC QUE HABIS COLOCADO

    INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel 12.0;Database=c:\testing.xls;',
    'SELECT <IntCarMes>, <Intidclient>, <VarNumCuent> FROM [Sheet1$]')
    SELECT  IntCarMes ,  Intidclient ,  VarNumCuent
    FROM Tbl_CarteraCliente
    where IntCarMes=93
    GO


    Estudiante_Sistemas
    Tuesday, November 09, 2010 7:44 PM
  • Holas

    bueno ya corregi,solo era poner las cabeceras en el excel,y si exporta,ahora solo debo mandar mi parametro y se acabo :)

     

    INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=c:\testing.xls;',
    'SELECT  IntCarMes ,  Intidclient ,  VarNumCuent  FROM [reporte$]')
    SELECT  IntCarMes ,  Intidclient ,  VarNumCuent
    FROM Tbl_CarteraCliente
    where IntCarMes=93


    Estudiante_Sistemas
    Tuesday, November 09, 2010 8:07 PM
  • Holas

    bueno ya corregi,solo era poner las cabeceras en el excel,y si exporta,ahora solo debo mandar mi parametro y se acabo :)

     

    INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=c:\testing.xls;',
    'SELECT  IntCarMes ,  Intidclient ,  VarNumCuent  FROM [reporte$]')
    SELECT  IntCarMes ,  Intidclient ,  VarNumCuent
    FROM Tbl_CarteraCliente
    where IntCarMes=93


    Estudiante_Sistemas

    Exactamente, solo te hacia falta quitar la parte donde puse [Sheet1$], ¿entonces pudiste solucionar tu problema?

    ¿Que resta para completar la exportación?

    Willy Taveras.-

    http://itlearn.net

    ahora debo armas un stored que mande un parametro y agregar mi consulta de arriba,solo eso

    Estudiante_Sistemas
    Tuesday, November 09, 2010 8:16 PM
  • Bueno si lo tengo casi listo,pero hay un detalle,PORQUE CADA VEZ que ejecuto el stored,queda guardado esa plantilla con los datos anteriores mmm deberia hacer una plantilla,osino borrar la data luego,algo asi,porque se guardan los datos que se ejecuto del stored....que puedo hacer?

    Solo faltaba ver ese detalle


    Estudiante_Sistemas
    Tuesday, November 09, 2010 8:47 PM
  • Hola.

    La alternativa que has utilizado (usar openrowset) tiene limitaciones. Una de ellas está en que el fichero se genera, físicamente, en el servidor de bases de datos o en una ruta desde la perspectiva del servidor. Además, ese fichero es único, tendrás que ocuparte de gestionar los accesos de múltiples usuarios dándole un nombre aleatorio, la eliminación del fichero si es necesario, etc.

    En el punto en el que estás, bastaría con que igual que realizas la inserción, realices el borrado antes de llenar de nuevo el excel. 


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Tuesday, November 09, 2010 9:14 PM
    Moderator
  • como puedo borrar los datos insertados?
    Estudiante_Sistemas
    Tuesday, November 09, 2010 9:30 PM
  • Hola.

    Limpia la hoja con un update sin where:

    UPDATE OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:\testing.xls";User ID=Admin;Password=;Extended properties="Excel 8.0;HRD=YES"')...Reportes$
    SET IntCarMes=NULL, Intidclient=NULL, VarNumCuent=NULL
    
    
    Borrarlos no se puede (otra limitación).


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Tuesday, November 09, 2010 9:41 PM
    Moderator
  • Hola.

    Limpia la hoja con un update sin where:

     

    UPDATE OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    
    'Data Source="c:\testing.xls";User ID=Admin;Password=;Extended properties="Excel 8.0;HRD=YES"')...Reportes$
    
    SET IntCarMes=NULL, Intidclient=NULL, VarNumCuent=NULL
    
    
    
    
    Borrarlos no se puede (otra limitación).

     


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    campo por campo entonces?

     

    mmmm algo problematico....

     


    Estudiante_Sistemas
    Tuesday, November 09, 2010 9:57 PM
  • Hola.

    No me parece que tener que especificar los campos en el update sea el mayor problema que tiene el método que quieres implementar. ¿Cuál es el inconveniente?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Tuesday, November 09, 2010 10:00 PM
    Moderator
  • Hola.

    No me parece que tener que especificar los campos en el update sea el mayor problema que tiene el método que quieres implementar. ¿Cuál es el inconveniente?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    alter PROCEDURE  Reporte_Xls_SGC0002_01    
    @IntCarMes INT    
    AS 
    UPDATE OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:\ReporteUltimaGestion.xls"User ID=Admin;Password=;Extended properties="Excel 8.0;HRD=YES"')
    SET DNI=NULL, Cliente=NULL, Ubicable=NULL
    INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=c:\ReporteUltimaGestion.xls;',
    'SELECT  DNI ,  Cliente ,  Ubicable
    ,CondicionLaboral,NumeroCuenta
    ,Producto
    ,FechadeCastigo
    ,MontoSaldoProducto,MontoCapitalProducto,CampanaDescuento,MontoporCancelar,TipoMoneda,FechaGestion
    ,Telefono1,Telefono2,Telefono3,Telefono4,Telefono5,Celular1,OperadorCelular1,Celular2,OperadorCelular2,DireccionCliente
    ,Distrito,Provincia,Departamento,Empresa,DistritoEmpresa,ProvinciaEmpresa,DepartamentoEmpresa,Gestor
    ,Calificacion,Respuesta,FechaPromesa,Observacion
     FROM [Reporte$]')
    SELECT   distinct  c.VarNumIdent AS DNI
    , c.VarNomClient AS Cliente
    , dbo.Ubicable(cc.IntIdClient) AS Ubicable
    ,   cc.VarCondLab  AS  CondicionLaboral
    , cc.VarNumCuent as  NumeroCuenta
    , cc.VarNomProd as Producto
    , cc.VarFechaCas as FechadeCastigo
    , cc.MonSalProd as MontoSaldoProducto
     , cc.MonCapProd as  MontoCapitalProducto
      , cc.VarCampDes as  CampanaDescuento
      , cc.MonPorCancel as  MontoporCancelar
      , cc.VarMoneda  as  TipoMoneda
    , dbo.Gest_Fecha(cc.IntCarMes, c.IntIdClient,cc.VarNumCuent) AS  FechaGestion
    , ISNULL(c.VarTel01, cc.VarTel01) AS Telefono1
    ,ISNULL(ISNULL(c.VarTel02, cc.VarTel02),'0')  AS Telefono2
    , ISNULL(c.VarTel03, cc.VarTel03) AS Telefono3
    , ISNULL(c.VarTel04, cc.VarTel04) AS Telefono4,
    ISNULL(c.VarTel05, cc.VarTel05) AS Telefono5
    , ISNULL(c.Varcelular, cc.VarCelular) AS Celular1, ISNULL(c.VarOpeCel, cc.VarOpeCel) AS OperadorCelular1,
    ISNULL(c.varcelular2, cc.VarCelular2) AS Celular2, ISNULL(c.VarOpeCel2, cc.VarOpeCel2) AS OperadorCelular2
    , ISNULL(c.VarDirecClient, cc.VarDirClient) AS DireccionCliente
    , ISNULL(dbo.Distrito(c.IntIdDist), dbo.Distrito(cc.IntIdDist)) AS Distrito
    , ISNULL(dbo.Provincia(c.IntIdDist), dbo.Provincia(cc.IntIdDist))AS Provincia
    , ISNULL(dbo.Departamento(c.IntIdDist), dbo.Departamento(cc.IntIdDist)) AS Departamento
    , ISNULL(c.VarNomEmp, cc.VarNomEmp) AS Empresa
    , ISNULL(dbo.Distrito(c.IntIdDistEmp), dbo.Distrito(cc.IntIdDistEmp)) AS DistritoEmpresa
    , ISNULL(dbo.Provincia(c.IntIdDistEmp), dbo.Provincia(cc.IntIdDistEmp)) AS ProvinciaEmpresa
    , ISNULL(dbo.Departamento(c.IntIdDistEmp), dbo.Departamento(cc.IntIdDistEmp)) AS DepartamentoEmpresa
    , dbo.Gest_Gestor(cc.IntCarMes, cc.IntIdClient, cc.VarNumCuent) AS Gestor
    , dbo.Gest_Aquien(cc.IntCarMes, cc.IntIdClient,cc.VarNumCuent) AS Calificacion
    , dbo.Gest_Respu(cc.IntCarMes, cc.IntIdClient, cc.VarNumCuent) AS Respuesta
    , dbo.Gest_FechaProm(cc.IntCarMes,cc.IntIdClient, cc.VarNumCuent) AS FechaPromesa
    , dbo.Gest_OBS(cc.IntCarMes, cc.IntIdClient, cc.VarNumCuent) AS Observacion
    FROM         dbo.Tbl_CarteraCliente AS cc INNER JOIN
                          dbo.Tbl_ClientePersona AS c ON c.IntIdClient = cc.IntIdClient
                          INNER JOIN  Tbl_CarteraMes CM
    ON CM.IdCarMes=cc.IntCarMes  
    INNER JOIN Tbl_Cartera Car
    ON Car.IntIdCar=CM.IntIdCar     
    WHERE  (cc.IntCarMes=@IntCarMes)    
    ORDER BY VarNomClient ASC

    =================================

    como es la parte que esta sombreada es la que sale este error:

    Msg 156, Level 15, State 1, Procedure Reporte_Xls_SGC0002_01, Line 10
    Incorrect syntax near the keyword 'SET'.


    Estudiante_Sistemas
    Tuesday, November 09, 2010 11:20 PM
  • Hola.

    Te falta parte de la línea:

    'Data Source="c:\ReporteUltimaGestion.xls"User ID=Admin;Password=;Extended properties="Excel 8.0;HRD=YES"')...Reportes$


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    Wednesday, November 10, 2010 8:10 AM
    Moderator
  • Hola si ya funciona quedo asi:

    UPDATE OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:\testing.xls";User ID=Admin;Password=;Extended properties="Excel 8.0;HRD=YES"')...reporte$
    SET IntCarMes=NULL, Intidclient=NULL, VarNumCuent=NULL

    where IntCarMes=114

     

     

     

    PERO,me he dado cuenta que cada vez que imprime x ejemplo son 800 registros,luego sigue imprimiendo abajo,en la 801,y asi cada vez que recibe parametro va bajando las filas....se puede hacer algo,para que siempre empieze en la segunda fila,ps la primera fila son cabeceras.


    Estudiante_Sistemas
    Wednesday, November 10, 2010 3:22 PM
  • Hola si ya funciona quedo asi:

    UPDATE OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:\testing.xls";User ID=Admin;Password=;Extended properties="Excel 8.0;HRD=YES"')...reporte$
    SET IntCarMes=NULL, Intidclient=NULL, VarNumCuent=NULL

    where IntCarMes=114

     

     

     

    PERO,me he dado cuenta que cada vez que imprime x ejemplo son 800 registros,luego sigue imprimiendo abajo,en la 801,y asi cada vez que recibe parametro va bajando las filas....se puede hacer algo,para que siempre empieze en la segunda fila,ps la primera fila son cabeceras.


    Estudiante_Sistemas
    ¿Estas utilizando el OpenDataSource para ingresar los datos? o estas utilizando el Integration Services Package?

    Willy Taveras.-

    http://itlearn.net


    uso el OpenDataSource,y tiene ese problema,cada vez que imprime

    Estudiante_Sistemas
    Wednesday, November 10, 2010 3:26 PM
  • Ese es el problema,aunque yo le tuve que poner un where porque sin where no funcionaba


    UPDATE OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:\testing.xls";User ID=Admin;Password=;Extended properties="Excel 8.0;HRD=YES"')...reporte$
    SET IntCarMes=NULL, Intidclient=NULL, VarNumCuent=NULL

    where IntCarMes=83

     

    y bueno tmb pasa que al momento de actrualizar como siempre recibe nuevo parametro no lo llega a borrar :S

    y cmienza imprimir debajo de la ultima fila


    Estudiante_Sistemas
    Wednesday, November 10, 2010 3:43 PM
  • Bueno sigo presentando problemas,al parecer la unica forma que no pase es eliminar,tendre q usar alguna manera de borrarlos desde el formulario,o hay otra solucion?

    Estudiante_Sistemas
    Wednesday, November 10, 2010 5:43 PM
  • al final solucione mi problema

    con el codigo q me dieron arriba insertaba,el resto esta en VB.NET

    dejo mi codigo:

     

     'Reporte de la última gestión
      Private Sub PrintRecordUltimaGestion()
        Dim dtsReporte As New DataSet
        Dim objExcel As New ClassExcel
        Dim xlsApp As excel.ApplicationClass
        Dim xlsWB As excel.WorkbookClass
        xlsApp = New excel.ApplicationClass
        sfd.InitialDirectory = "C:\"
        sfd.DefaultExt = ".xls"
        sfd.Filter = "Archivos Excel (.xls)|*.xls"
        Dim result As Boolean = sfd.ShowDialog()
        ' Process open file dialog box results
        If result = True Then
          'Creando una copia de la plantilla en el servidor, este caso local
          Dim sArchivoOrigen As String = "\\IP\Exceles\plantilla.xls" '"C:\Exceles\plantilla.xls"
          Dim sRutaDestino As String = "\\IP\Exceles\reporte.xls" '"C:\Exceles\reporte.xls"
          My.Computer.FileSystem.CopyFile(sArchivoOrigen, _
                        sRutaDestino, _
                        True)
          'Devuelve la cantidad de filas
          Dim inx As Integer
          bta.IntCarMes = IntIdCarMesResultado
          If lTotalFlas.RetornaIntFilas(bta) Then
            inx = bta.IntFilas
          End If
          If inx = 0 Then
            MsgBox("No existen datos para generar el reporte.", MessageBoxIcon.Information, "Cescont SAC")
            Exit Sub
          Else
            'Chapando el origen, local en este caso
            sArchivoOrigen = "\\IP\Exceles\reporte.xls" '"C:\Exceles\reporte.xls"
            'Y moviendo archivo al cliente
            sRutaDestino = sfd.FileName '"C:\reporte" & Today().Day & Today.Month & Today.Year & ".xls"
    
            My.Computer.FileSystem.MoveFile(sArchivoOrigen, _
                          sRutaDestino, _
                          True)
    
            If inx > 0 Then
              MsgBox("Se genero el reporte", MsgBoxStyle.Information, sTit)
              xlsWB = xlsApp.Workbooks.Open(sRutaDestino)
              xlsApp.Visible = True
              xlsApp.Range(xlsApp.Cells(2, 1), xlsApp.Cells(inx + 1, 35)).Select()
              xlsApp.Selection.Borders.ColorIndex = enuCOLORESEXCELL.Negro
              xlsApp.Selection.Font.Bold = False
              'xlsApp.Selection.Interior = enuCOLORESEXCELL.Blanco
    
            End If
          End If
        End If
        xlsApp = Nothing
      End Sub

     

    Espero le ayude a otros

    Gracias.

    Slds.


    Estudiante_Sistemas
    • Marked as answer by Rosita_Lima Friday, November 12, 2010 9:13 PM
    Friday, November 12, 2010 9:12 PM