Array vb.net 2010

Iniciado por xskyx, 29 Marzo 2015, 07:28 AM

0 Miembros y 1 Visitante están viendo este tema.

xskyx

Hola.
tengo un problema con arrays en vb.net, tengo 12 array que contendrán distintos datos que luego escribo en un archivo xml, el problema es que no todos los arrays contendrán datos o no todos tendrán el mismo número de datos y eso me genera problemas.

lo que necesito o quisiera hacer es llenar de ceros los que tengan menos datos e igual con los que no tengan ningún dato.

lo que tengo hasta el memento es lo siguiente:

Código (vbnet) [Seleccionar]
Do While tmp1 <= var1.Length
           If var2(tmp1) = Nothing Then
               var2(tmp1) = 0
           End If
           If var3(tmp1) = Nothing Then
               var3(tmp1) = 0
           End If
           If var4(tmp1) = Nothing Then
               var4(tmp1) = 0
           End If
           If var5(tmp1) = Nothing Then
               var5(tmp1) = 0
           End If
           If var6(tmp1) = Nothing Then
               var6(tmp1) = 0
           End If
           If var7(tmp1) = Nothing Then
               var7(tmp1) = 0
           End If
           If var8(tmp1) = Nothing Then
               var8(tmp1) = 0
           End If
           If var9(tmp1) = Nothing Then
               var9(tmp1) = 0
           End If
           If var10(tmp1) = Nothing Then
               var10(tmp1) = 0
           End If
           If var11(tmp1) = Nothing Then
               var11(tmp1) = 0
           End If
           If var12(tmp1) = Nothing Then
               var12(tmp1) = 0
           End If
           tmp1 += 1
       Loop

Eleкtro

#1
Estoy convencido de que lo que estás intentando hacer, llenar con ceros, no es la solución más adecuada y debe ser causa de un problema que viene detrás.

Muestra las declaraciones de dichos Arrays, de la variable tmp1, y el método de escritura que te genera problemas, explica el problema que tienes un poco más a fondo para poder proponerte el enfoque adecuado.

De todas formas, ten en cuenta que puedes inicializar el Array al declararlo, de la siguiente manera por ejemplo:
Código (vbnet) [Seleccionar]
Dim arr1 As Integer() = Enumerable.Repeat(Of Integer)(element:=-1, count:=10).ToArray()

Eso podría evitar los problemas de elementos nulos que comentas y que no sabemos exactamente por qué tienes ese problema.

Saludos








xskyx

Dim var1 As Array = Form1.TextBox1.Lines
       Dim var2 As Array = Form1.TextBox4.Lines
       Dim var3 As Array = Form1.TextBox6.Lines
       Dim var4 As Array = Form1.TextBox8.Lines
       Dim var5 As Array = Form1.TextBox16.Lines
       Dim var6 As Array = Form1.TextBox14.Lines
       Dim var7 As Array = Form1.TextBox12.Lines
       Dim var8 As Array = Form1.TextBox10.Lines
       Dim var9 As Array = Form1.TextBox24.Lines
       Dim var10 As Array = Form1.TextBox22.Lines
       Dim var11 As Array = Form1.TextBox20.Lines
       Dim var12 As Array = Form1.TextBox18.Lines


No puedo inicializar el array porque no se cuantos datos va a contener y necesito que todos lleven la misma cantidad de datos respetando lo que ya se ha puesto en los cajones de texto.

mas adelante hago lo siguiente:

       Do While i <= var1.Length

           c1 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c2 = <a><![CDATA[<]]></a>.Value & nombre1 & <a><![CDATA[>]]></a>.Value
           c3 = <a><![CDATA[<p>]]></a>.Value & var1(i) & <a><![CDATA[</p>]]></a>.Value
           c4 = <a><![CDATA[</]]></a>.Value & nombre1 & <a><![CDATA[>]]></a>.Value

           c5 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c6 = <a><![CDATA[<]]></a>.Value & nombre2 & <a><![CDATA[>]]></a>.Value
           c7 = <a><![CDATA[<p>]]></a>.Value & var2(i) & <a><![CDATA[</p>]]></a>.Value
           c8 = <a><![CDATA[</]]></a>.Value & nombre2 & <a><![CDATA[>]]></a>.Value

           i += 1

       Loop


no soy programador así que lo que hago es bastante tosco.

xskyx

#3
Dejo el link del proyecto el que dice "copia" es la versión que funcionaba pero solo con una variable.

El proyecto genera la base de datos, para datos variables de Illustrator CC.

Eleкtro

#4
Buenas

Lamento decirte que absolutamente todo es inapropiado en el código, empezando por los tipos que estás utilizando (Array) cómo la masiva repetición de código (...¿49 variables para lo mismo?...), la manera de iterar un array, el intento de asignar un valor a un elemento inexistente fuera del rango del Array, y por último la construcción "manual" del documento XML, donde podrías utilizar classes específicas para ello cómo XmlWriter.

El motivo que das de no ser programador no me sirve cómo justificación, puesto que, aparte de estar programando, conoces y sabes utilizar un loop (aunque sea de tipo While)  :¬¬.

El problema con el primer código que mostraste es que estás intentando asignar un valor a un elemento inexistente del Array, al intentar acceder al índice obviamente esto causa una excepción de índice fuera de rango.
De la forma en que pretendías corregir ese problema (llenando con Ceros) primero deberías haber inicializado un Array adicional (es decir, 12 Arrays adicionales más) con más espacio (más elementos) y copiar el contenido de uno a otro Array, algo que sin duda sería bastante engorroso,
en lugar de Arrays podrías haber utilizado listas genéricas y así utilizar el método List.Add() para añadir elementos "vacíos", pero eso tampoco me parece una solución apropiada, ya que no solo los Arrays del código suponen un problema, sino todo lo demás, por ese motivo te sugiero que vuelvas a re-escribir todo lo que tienes hecho para generar un código ausente de problemas.

Te ayudaría a corregirlo y simplificar todo mostrándote un código con un enfoque distinto, pero no entiendo muy bien lo que pretendes hacer con esos 12 TextBoxes (¿por qué no son 11 o 13 por ejemplo?)...

Prueba a empezar por eliminar todo esto:

Código (vbnet) [Seleccionar]
       Dim c1 As String
       Dim c2 As String
       Dim c3 As String
       Dim c4 As String
       Dim c5 As String
       Dim c6 As String
       Dim c7 As String
       Dim c8 As String
       Dim c9 As String
       Dim c10 As String
       Dim c11 As String
       Dim c12 As String
       Dim c13 As String
       Dim c14 As String
       Dim c15 As String
       Dim c16 As String
       Dim c17 As String
       Dim c18 As String
       Dim c19 As String
       Dim c20 As String
       Dim c21 As String
       Dim c22 As String
       Dim c23 As String
       Dim c24 As String
       Dim c25 As String
       Dim c26 As String
       Dim c27 As String
       Dim c28 As String
       Dim c29 As String
       Dim c30 As String
       Dim c31 As String
       Dim c32 As String
       Dim c33 As String
       Dim c34 As String
       Dim c35 As String
       Dim c36 As String
       Dim c37 As String
       Dim c38 As String
       Dim c39 As String
       Dim c40 As String
       Dim c41 As String
       Dim c42 As String
       Dim c43 As String
       Dim c44 As String
       Dim c45 As String
       Dim c46 As String
       Dim c47 As String
       Dim c48 As String
       Dim c49 As String


       Do While tmp1 <= var1.Length
           If var2(tmp1) = Nothing Then
               var2(tmp1) = 0
           End If
           If var3(tmp1) = Nothing Then
               var3(tmp1) = 0
           End If
           If var4(tmp1) = Nothing Then
               var4(tmp1) = 0
           End If
           If var5(tmp1) = Nothing Then
               var5(tmp1) = 0
           End If
           If var6(tmp1) = Nothing Then
               var6(tmp1) = 0
           End If
           If var7(tmp1) = Nothing Then
               var7(tmp1) = 0
           End If
           If var8(tmp1) = Nothing Then
               var8(tmp1) = 0
           End If
           If var9(tmp1) = Nothing Then
               var9(tmp1) = 0
           End If
           If var10(tmp1) = Nothing Then
               var10(tmp1) = 0
           End If
           If var11(tmp1) = Nothing Then
               var11(tmp1) = 0
           End If
           If var12(tmp1) = Nothing Then
               var12(tmp1) = 0
           End If
           tmp1 += 1
       Loop

       Do While i <= var1.Length

           c1 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c2 = <a><![CDATA[<]]></a>.Value & nombre1 & <a><![CDATA[>]]></a>.Value
           c3 = <a><![CDATA[<p>]]></a>.Value & var1(i) & <a><![CDATA[</p>]]></a>.Value
           c4 = <a><![CDATA[</]]></a>.Value & nombre1 & <a><![CDATA[>]]></a>.Value

           c5 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c6 = <a><![CDATA[<]]></a>.Value & nombre2 & <a><![CDATA[>]]></a>.Value
           c7 = <a><![CDATA[<p>]]></a>.Value & var2(i) & <a><![CDATA[</p>]]></a>.Value
           c8 = <a><![CDATA[</]]></a>.Value & nombre2 & <a><![CDATA[>]]></a>.Value

           c9 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c10 = <a><![CDATA[<]]></a>.Value & nombre3 & <a><![CDATA[>]]></a>.Value
           c11 = <a><![CDATA[<p>]]></a>.Value & var3(i) & <a><![CDATA[</p>]]></a>.Value
           c12 = <a><![CDATA[</]]></a>.Value & nombre3 & <a><![CDATA[>]]></a>.Value

           c13 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c14 = <a><![CDATA[<]]></a>.Value & nombre4 & <a><![CDATA[>]]></a>.Value
           c15 = <a><![CDATA[<p>]]></a>.Value & var4(i) & <a><![CDATA[</p>]]></a>.Value
           c16 = <a><![CDATA[</]]></a>.Value & nombre4 & <a><![CDATA[>]]></a>.Value

           c17 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c18 = <a><![CDATA[<]]></a>.Value & nombre5 & <a><![CDATA[>]]></a>.Value
           c19 = <a><![CDATA[<p>]]></a>.Value & var5(i) & <a><![CDATA[</p>]]></a>.Value
           c20 = <a><![CDATA[</]]></a>.Value & nombre5 & <a><![CDATA[>]]></a>.Value

           c21 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c22 = <a><![CDATA[<]]></a>.Value & nombre6 & <a><![CDATA[>]]></a>.Value
           c23 = <a><![CDATA[<p>]]></a>.Value & var6(i) & <a><![CDATA[</p>]]></a>.Value
           c24 = <a><![CDATA[</]]></a>.Value & nombre6 & <a><![CDATA[>]]></a>.Value

           c25 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c26 = <a><![CDATA[<]]></a>.Value & nombre7 & <a><![CDATA[>]]></a>.Value
           c27 = <a><![CDATA[<p>]]></a>.Value & var7(i) & <a><![CDATA[</p>]]></a>.Value
           c28 = <a><![CDATA[</]]></a>.Value & nombre7 & <a><![CDATA[>]]></a>.Value

           c29 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c30 = <a><![CDATA[<]]></a>.Value & nombre8 & <a><![CDATA[>]]></a>.Value
           c31 = <a><![CDATA[<p>]]></a>.Value & var8(i) & <a><![CDATA[</p>]]></a>.Value
           c32 = <a><![CDATA[</]]></a>.Value & nombre8 & <a><![CDATA[>]]></a>.Value

           c33 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c34 = <a><![CDATA[<]]></a>.Value & nombre9 & <a><![CDATA[>]]></a>.Value
           c35 = <a><![CDATA[<p>]]></a>.Value & var9(i) & <a><![CDATA[</p>]]></a>.Value
           c36 = <a><![CDATA[</]]></a>.Value & nombre9 & <a><![CDATA[>]]></a>.Value

           c37 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c38 = <a><![CDATA[<]]></a>.Value & nombre10 & <a><![CDATA[>]]></a>.Value
           c39 = <a><![CDATA[<p>]]></a>.Value & var10(i) & <a><![CDATA[</p>]]></a>.Value
           c40 = <a><![CDATA[</]]></a>.Value & nombre10 & <a><![CDATA[>]]></a>.Value

           c41 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c42 = <a><![CDATA[<]]></a>.Value & nombre11 & <a><![CDATA[>]]></a>.Value
           c43 = <a><![CDATA[<p>]]></a>.Value & var11(i) & <a><![CDATA[</p>]]></a>.Value
           c44 = <a><![CDATA[</]]></a>.Value & nombre11 & <a><![CDATA[>]]></a>.Value

           c45 = <a><![CDATA[<v:sampleDataSet dataSetName="]]></a>.Value & "datos" & i & <a><![CDATA[">]]></a>.Value
           c46 = <a><![CDATA[<]]></a>.Value & nombre12 & <a><![CDATA[>]]></a>.Value
           c47 = <a><![CDATA[<p>]]></a>.Value & var12(i) & <a><![CDATA[</p>]]></a>.Value
           c48 = <a><![CDATA[</]]></a>.Value & nombre12 & <a><![CDATA[>]]></a>.Value

           c49 = <a><![CDATA[</v:sampleDataSet>]]></a>.Value

           Cuerpo_xml = Cuerpo_xml & vbCrLf & c1 & vbCrLf & c2 & vbCrLf & c3 & vbCrLf & c4 & vbCrLf & c5 & _
            vbCrLf & c6 & vbCrLf & c7 & vbCrLf & c8 & vbCrLf & c9 & vbCrLf & c10 & _
             vbCrLf & c11 & vbCrLf & c12 & vbCrLf & c13 & vbCrLf & c14 & vbCrLf & c15 & _
              vbCrLf & c16 & vbCrLf & c17 & vbCrLf & c18 & vbCrLf & c19 & vbCrLf & c20 & _
               vbCrLf & c21 & vbCrLf & c22 & vbCrLf & c23 & vbCrLf & c24 & vbCrLf & c25 & _
                vbCrLf & c26 & vbCrLf & c27 & vbCrLf & c28 & vbCrLf & c29 & vbCrLf & c30 & _
                 vbCrLf & c31 & vbCrLf & c32 & vbCrLf & c33 & vbCrLf & c34 & vbCrLf & c35 & _
                  vbCrLf & c36 & vbCrLf & c37 & vbCrLf & c38 & vbCrLf & c39 & vbCrLf & c40 & _
                   vbCrLf & c41 & vbCrLf & c42 & vbCrLf & c43 & vbCrLf & c44 & vbCrLf & c45 & _
                    vbCrLf & c46 & vbCrLf & c47 & vbCrLf & c48 & vbCrLf & c49 & vbCrLf

           i += 1

       Loop


Y reemplaza todo ese código eliminado por un loop que itere los elementos de cada array, podría ser algo cómo esto (no se si produce el formato que deseas):

Código (vbnet) [Seleccionar]
       Dim arrays As IEnumerable(Of Array) =
           {
               var1, var2, var3,
               var4, var5, var6,
               var7, var8, var9,
               var10, var11, var12
           }

       Dim count As Integer = 0

       Dim sb As New System.Text.StringBuilder
       With sb

           For Each arr As Array In arrays

               For Each value As String In arr

                   count += 1

                   .AppendLine(String.Format("<v:sampleDataSet dataSetName=""datos {0}"">", CStr(count)))
                   .AppendLine(String.Format("<{0}>", nombre1))
                   .AppendLine(String.Format("<p>{0}</p>", value))
                   .AppendLine(String.Format("</{0}>", nombre1))
                   .AppendLine()

               Next value

           Next arr

       End With

       Dim xmlText As String = Me.cuerpo_xml & sb.ToString & Me.fin_xml


Saludos!








xskyx

#5
Este es el resultado:

Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN"    "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd" [
 <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
 <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
 <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
 <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
 <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
 <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
]>
<svg>
<variableSets  xmlns="&ns_vars;">
 <variableSet  varSetName="binding1" locked="none">
   <variables><variable varName="num" trait="textcontent" category="&ns_flows;"></variable><variable varName="let" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable><variable varName="" trait="textcontent" category="&ns_flows;"></variable></variables>
   <v:sampleDataSets  xmlns:v="http://ns.adobe.com/Variables/1.0/" xmlns="http://ns.adobe.com/GenericCustomNamespace/1.0/"><v:sampleDataSet dataSetName="datos 1">
<num>
<p>1</p>
</num>

<v:sampleDataSet dataSetName="datos 2">
<num>
<p>2</p>
</num>

<v:sampleDataSet dataSetName="datos 3">
<num>
<p>3</p>
</num>

<v:sampleDataSet dataSetName="datos 4">
<num>
<p>a</p>
</num>

<v:sampleDataSet dataSetName="datos 5">
<num>
<p>b</p>
</num>

<v:sampleDataSet dataSetName="datos 6">
<num>
<p>c</p>
</num>

   </v:sampleDataSets>
 </variableSet>
</variableSets>
</svg>


Esto es lo que yo necesito:

Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN"    "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd" [
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
]>
<svg>
<variableSets  xmlns="&ns_vars;">
<variableSet  locked="none" varSetName="binding1">
<variables>
<variable  category="&ns_flows;" varName="Variable1" trait="textcontent"></variable>
<variable  category="&ns_flows;" varName="Variable2" trait="textcontent"></variable>
</variables>
<v:sampleDataSets  xmlns:v="&ns_vars;" xmlns="&ns_custom;">
<v:sampleDataSet  dataSetName="Conj. de datos 1">
<Variable1>
<p>1</p>
</Variable1>
<Variable2>
<p>a</p>
</Variable2>
</v:sampleDataSet>
<v:sampleDataSet  dataSetName="Conj. de datos 2">
<Variable1>
<p>2</p>
</Variable1>
<Variable2>
<p>b</p>
</Variable2>
</v:sampleDataSet>
<v:sampleDataSet  dataSetName="Conj. de datos 3">
<Variable1>
<p>3</p>
</Variable1>
<Variable2>
<p>c</p>
</Variable2>
</v:sampleDataSet>
</v:sampleDataSets>
</variableSet>
</variableSets>
</svg>


El código ya no da problemas con los array, con respecto a los textbox no importa que fueran 20 o 50 entre más mejor. Y te reitero que no soy programador del código que pusiste que resuelve el problema de los array pero que no es valido en Adobe Illustrator no entiendo nada por eso no puedo arreglarlo.

Mi único problema son los array porque el xml que genero con mis 49 variables es valido.

Yo entiendo y se que mi código es pésimo, pero es lo que entiendo.

Muchas gracias por tu ayuda.

xskyx

Solucionado:

Código (vbnet) [Seleccionar]
        If var2.Length < var1.Length Then
            For index = var2.Length To var1.Length
                ReDim Preserve var2(UBound(var2) + 1)
                var2(UBound(var2)) = 0
            Next
        End If
        If var3.Length < var1.Length Then
            For index = var3.Length To var1.Length
                ReDim Preserve var3(UBound(var3) + 1)
                var3(UBound(var3)) = 0
            Next
        End If
        If var4.Length < var1.Length Then
            For index = var4.Length To var1.Length
                ReDim Preserve var4(UBound(var4) + 1)
                var4(UBound(var4)) = 0
            Next
        End If
        If var5.Length < var1.Length Then
            For index = var5.Length To var1.Length
                ReDim Preserve var5(UBound(var5) + 1)
                var5(UBound(var5)) = 0
            Next
        End If
        If var6.Length < var1.Length Then
            For index = var6.Length To var1.Length
                ReDim Preserve var6(UBound(var6) + 1)
                var6(UBound(var6)) = 0
            Next
        End If
        If var7.Length < var1.Length Then
            For index = var7.Length To var1.Length
                ReDim Preserve var7(UBound(var7) + 1)
                var7(UBound(var7)) = 0
            Next
        End If
        If var8.Length < var1.Length Then
            For index = var8.Length To var1.Length
                ReDim Preserve var8(UBound(var8) + 1)
                var8(UBound(var8)) = 0
            Next
        End If
        If var9.Length < var1.Length Then
            For index = var9.Length To var1.Length
                ReDim Preserve var9(UBound(var9) + 1)
                var9(UBound(var9)) = 0
            Next
        End If
        If var10.Length < var1.Length Then
            For index = var10.Length To var1.Length
                ReDim Preserve var10(UBound(var10) + 1)
                var10(UBound(var10)) = 0
            Next
        End If
        If var11.Length < var1.Length Then
            For index = var11.Length To var1.Length
                ReDim Preserve var11(UBound(var11) + 1)
                var11(UBound(var11)) = 0
            Next
        End If
        If var12.Length < var1.Length Then
            For index = var12.Length To var1.Length
                ReDim Preserve var12(UBound(var12) + 1)
                var12(UBound(var12)) = 0
            Next
        End If