Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] Bucle para factura

Estas en el tema de Bucle para factura en el foro de .NET en Foros del Web. buenas foreros! Os traigo una gran duda que por mas que lo intento, no consigo sacar una respuesta en claro. quiero hacer que me muestre ...
  #1 (permalink)  
Antiguo 13/04/2016, 05:05
 
Fecha de Ingreso: abril-2016
Ubicación: C:\Usuarios\isaac
Mensajes: 33
Antigüedad: 8 años
Puntos: 1
Bucle para factura

buenas foreros!

Os traigo una gran duda que por mas que lo intento, no consigo sacar una respuesta en claro.

quiero hacer que me muestre en el correo, un html con una tabla que me ponga lo siguiente:

nombre_cliente id_pedido
________________________________________

articulo1 cantidad1
articulo2 cantidad2
articulo3 cantidad3
. .
. .


Bien, pues mi código es el siguiente (os paso el trozo de fragmento para que divagareis):

Código vb:
Ver original
  1. Imports System.Xml
  2. Imports MySql.Data.MySqlClient
  3.  
  4. Module Module1
  5.     Sub Main()
  6.         'Primero leemos el archivo config.xml
  7.        Dim lector As XmlTextReader = New XmlTextReader("config.xml")
  8.         Dim xml(5) As String
  9.         Dim i As Integer
  10.         i = 0
  11.         Do While (lector.Read())
  12.             Select Case lector.NodeType
  13.                 Case XmlNodeType.Text
  14.                     xml(i) = lector.Value
  15.                     i = i + 1
  16.             End Select
  17.         Loop
  18.         'Ahora la conexion a nuestro servidor
  19.        Dim consulta As New MySqlCommand("select email from usuarios;")
  20.         Dim conexion As New MySqlConnection("server=" & xml(0) & ";database=" & xml(1) & ";uid=" & xml(2) & ";password=" & xml(3) & ";")
  21.         Try
  22.             conexion.Open()
  23.         Catch ex As Exception
  24.             Console.WriteLine("No se puede conectar a la base de datos")
  25.         End Try
  26.         consulta.Connection = conexion
  27.         'Procedemos a ejecutar el select
  28.        Dim adaptador As New MySqlDataAdapter
  29.         adaptador.SelectCommand = consulta
  30.         Dim datos As New DataTable
  31.         adaptador.Fill(datos)
  32.         Dim adaptador2 As New MySqlDataAdapter
  33.         adaptador2.SelectCommand = consulta
  34.         Dim datos2 As New DataTable
  35.         adaptador2.Fill(datos2)
  36.         Dim filas = datos2.Rows.Count()
  37.         Dim columnas = datos.Columns.Count()
  38.         For i = 0 To filas - 1
  39.             Dim row As DataRow = datos2.Rows(i)
  40.             For j = 0 To columnas - 1
  41.                 'una vez tenemos el bucle que nos devuelve TODOS los resultados, ahora pondremos ese row(j) en el destinatario
  42.                'de los correos
  43.                Dim smtp As New System.Net.Mail.SmtpClient()
  44.                 Dim mensaje As New System.Net.Mail.MailMessage()
  45.                 'Configuramos el SMTP
  46.                smtp.Credentials = New System.Net.NetworkCredential(xml(4), xml(5))
  47.                 smtp.Host = "smtp.gmail.com"
  48.                 smtp.Port = "587"
  49.                 smtp.EnableSsl = True
  50.                 'Configuramos mensaje
  51.                mensaje.From = New System.Net.Mail.MailAddress("[email protected]", "prueba_nombre", System.Text.Encoding.UTF8)
  52.                 'mensaje.To.Add(row(j))
  53.                mensaje.To.Add("[email protected]")
  54.                 mensaje.Subject = "asunto"
  55.                 mensaje.SubjectEncoding = System.Text.Encoding.UTF8
  56.                 mensaje.IsBodyHtml = True
  57.                 'Preparamos otro select que recorra por cada correo este select y envíe el resultado
  58.                Dim conexionsql As New SqlClient.SqlConnection("server=localhost;database=bbdd;uid=root;password=pass;")
  59.                 Dim consultahtml As New SqlClient.SqlCommand("SELECT TCLIENTES2 AS NOMBRE, TPEDIDOS1 as NºPEDIDO, TVALORESPEDIDOS3 AS DESC_ART_PED, TVALORESPEDIDOS7 AS CANT_ART_PED
  60.                FROM TPEDIDOS INNER JOIN TVALORESPEDIDOS ON TVALORESPEDIDOS.TVALORESPEDIDOS19=TPEDIDOS.TPEDIDOS1
  61.                 INNER JOIN TCLIENTES ON TCLIENTES.TCLIENTES1 = TPEDIDOS.TPEDIDOS9 WHERE TPEDIDOS2='20160104 00:00:00.000' ORDER BY NOMBRE;")
  62.  
  63.                 Dim consultaCliente As New SqlClient.SqlCommand("")
  64.  
  65.                 consultahtml.Connection = conexionsql
  66.  
  67.                 Dim adaptadorhtml1 As New SqlClient.SqlDataAdapter
  68.                 adaptadorhtml1.SelectCommand = consultahtml
  69.                 Dim datoshtml1 As New DataTable
  70.                 adaptadorhtml1.Fill(datoshtml1)
  71.  
  72.                 Dim adaptadorhtml2 As New SqlClient.SqlDataAdapter
  73.                 adaptadorhtml2.SelectCommand = consultahtml
  74.                 Dim datoshtml2 As New DataTable
  75.                 adaptadorhtml2.Fill(datoshtml2)
  76.  
  77.                 Dim filashtml = datoshtml2.Rows.Count()
  78.                 Dim columnashtml = datoshtml1.Columns.Count()
  79.                 Console.WriteLine(filashtml)
  80.                 Console.WriteLine(columnashtml)
  81.  
  82.                 My.Computer.FileSystem.WriteAllText("prueba.txt", "<table border='1'>", True)
  83.  
  84. 'Aqui es donde anda el problema....              
  85.  
  86.                 For k = 0 To filashtml - 1
  87.                     Dim rowhtml As DataRow = datoshtml2.Rows(k)
  88.                     For l = 0 To columnashtml - 1
  89.                         Dim colhtml As DataColumn = datoshtml1.Columns(l)
  90.                         If Not rowhtml(0) Is Nothing Then
  91.                             My.Computer.FileSystem.WriteAllText("prueba.txt", "<tr><th>" & CStr(rowhtml(0)) & "</th>", True)
  92.                         End If
  93.                         If Not rowhtml(1) Is Nothing Then
  94.                             My.Computer.FileSystem.WriteAllText("prueba.txt", "<th>" & CStr(rowhtml(1)) & "</th></tr>", True)
  95.                         End If
  96.                         'ahora el bucle para los articulos
  97.                        If rowhtml(2) Then
  98.                             My.Computer.FileSystem.WriteAllText("prueba.txt", "<tr><td>" & CStr(rowhtml(2)) & "</td>", True)
  99.                         ElseIf rowhtml(3) Then
  100.                             My.Computer.FileSystem.WriteAllText("prueba.txt", "<td>" & CStr(rowhtml(3)) & "</td></tr>", True)
  101.                         End If
  102.                         Select Case rowhtml(l)
  103.                             Case rowhtml(0)
  104.  
  105.                         End Select
  106.                     Next
  107.                 Next
  108.                 My.Computer.FileSystem.WriteAllText("prueba.txt", "</table>", True)
  109.  
  110.                 Dim lectorhtml As String
  111.                 lectorhtml = My.Computer.FileSystem.ReadAllText("prueba.txt")
  112.                 mensaje.Body =
  113.                         "<html><body>" & lectorhtml & "</body></html>"
  114.                 mensaje.BodyEncoding = System.Text.Encoding.UTF8
  115.                 mensaje.Priority = System.Net.Mail.MailPriority.High
  116.                 'Configuramos el envio
  117.                Try
  118.                     smtp.Send(mensaje)
  119.                 Catch ex As Exception
  120.                     Console.WriteLine("No se ha podido enviar el mensaje")
  121.                 End Try
  122.                 My.Computer.FileSystem.DeleteFile("prueba.txt")
  123.             Next
  124.         Next
  125.     End Sub
  126. End Module

Reitero que el problema lo tengo en la zona donde escribo los <tr> y los <td> en el fichero prueba.txt. Si veis burradas, pido disculpas, pero estoy aprendiendo este lenguaje y mi unico profesor es google y sus ejemplos.

Un saludo y espero vuestra ayuda
__________________
"He intentado cambiar el mundo, pero no he encontrado el código fuente"
  #2 (permalink)  
Antiguo 13/04/2016, 05:31
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Bucle para factura

Dos consejos:
- Pon el código más legible y con nombres de variables claros. Cada vez que veo cosas como: datos1, datos2, datos3..., adaptadorhtml1, adaptadorhtml2, ... se me ponen los pelos de punta. Luego cuando estás leyendo el código no sabes a que hace referencia cada adaptador. No queda más claro "adaptadorEmails" que "adaptador" ? Que por cierto, adaptador2 contiene los mismos datos que adaptador porque se lanzan con la misma consulta.

- En este código
Código:
For k = 0 To filashtml - 1
                    Dim rowhtml As DataRow = datoshtml2.Rows(k)
No sería mejor usar un foreach contra la propiedad Rows del dataTable? Parece una tontería pero reducirías código y errores.
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 13/04/2016, 07:17
 
Fecha de Ingreso: abril-2016
Ubicación: C:\Usuarios\isaac
Mensajes: 33
Antigüedad: 8 años
Puntos: 1
Respuesta: Bucle para factura

Muchas gracias Malenko por reponder:

Como ya mencioné, en esto no tengo una "base", es por ello que aun me lío al poner nombres a las variables y demás. Lo poco que he echo de programacion hasta el momento (si es que se puede considerar) es php.

Estoy haciendo lo que me comentaste, quitar todo el codigo de adaptador2 y hacer el foreach...a ver si consigo solucionar algo...igualmente sigo teniendo la duda principal, pero agradezco mucho este tipo de consejos.

un saludo Malenko
__________________
"He intentado cambiar el mundo, pero no he encontrado el código fuente"
  #4 (permalink)  
Antiguo 13/04/2016, 07:20
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Bucle para factura

Es que dejando el código más limpio y más claro será más fácil encontrar el error. Cuando lo tengas más arreglado vuelve a pegarlo y le damos un vistazo. Ya verás como con el código pulido encontrar el error será un momento.
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 13/04/2016, 08:29
 
Fecha de Ingreso: abril-2016
Ubicación: C:\Usuarios\isaac
Mensajes: 33
Antigüedad: 8 años
Puntos: 1
Respuesta: Bucle para factura

Vale, ya esta solucionado! Me sobraba un bucle for, en concreto el del columnashtml.

quitando eso, y las cosas que me ha comentado malenko he conseguido hacer mi modelo de factura por gmail AL FIN.

Muchas gracias por todo y doy el post por solucionado ;)
__________________
"He intentado cambiar el mundo, pero no he encontrado el código fuente"

Etiquetas: bucle, datatable, factura, net, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:22.