Migracion

De GrialWIKI

(Redirigido desde Conversion)

Contenido

Notas para la Conversión de VB6 a VB.NET

Acceso al .Value de una columna en un Recordset

Para acceder a los valores de una row, se debe usar la coleccion "Value" que es la colección default del objeto Recordset.

Nombre de campo explícito

Si el nombre del campo es constante, se debe usar: Rst!fieldname

Por ejemplo: PE20Grq.Rst!ID_PREEJEC20

También funciona en los objetos GrialQuery, por lo que ahora se puede escribir:

Por ejemplo: PE20Grq!ID_PREEJEC20

Nombre de campo en una variable

Si el nombre del campo esta en una variable, usar .Value(fieldname)

Por ejemplo:

Cuando en el codigo VB6 viejo dice Rst.Fields(fieldname).Value Hay que reeemplazar por Rst.VALUE(fieldname)

VB6:  Bienes_PresFis_ste.CurrentValue = grq2.Rst.Fields(Bienes_PresFis_ste.IDField).Value
NET:  Bienes_PresFis_ste.CurrentValue = grq2.Rst.VALUE(Bienes_PresFis_ste.IDField)


Gosub/Return

"Gosub" no esta soportado en VB.NET

Para convertir, por ejemplo un "Sub CorteControl" que utilice internamente rutinas con "Gosub" hacer lo siguiente:

  1. Crear una Private Class CorteControl_Class (interna, dentro de la clase actual)
  2. Colocar las variables generales del "Sub CorteControl" como variables privadas de la "Private Class CorteControl_Class"
  3. Agregar una propiedad "Dim Host As MainForm" al principio de la nueva clase
  4. Crear un "Sub Proc()" dentro de la clase y colocar el codigo del "Sub CorteControl"
  5. Crear un Sub por cada rutina de gosub que existia en el "Sub CorteControl" original
    1. Por Ejemplo si decia "Gosub Rutina1", crear un "Sub Rutina1" dentro de la clase
  6. Reemplazar los Gosub, por llamadas a los sub (eliminar la palabra gosub directamente)
  7. El "Sub CorteControl" original que se reemplaza debe quedar:
    1. Sub CorteControl()
    2. Dim a as New CorteControl_Class()
    3. a.Host = Me
    4. a.Proc()
    5. End Sub

Debido a que "CorteControl_Class" pasará a ser una "clase", no tiene acceso directo a las variables del formulario principal (MainForm). Es por eso que se crea la variable "Host as MainForm" y se asigna (a.Host = Me) antes de llamar al método "Proc"

Dentro de los subs de la clase, se debe colocar "Host." para acceder a las variables generales del Form. Para identificar dónde agrear "Host." revisar el codigo de los subs dentro de la clase buscando el siguiente error informado por el IDE de .NET: "Error 10: La referencia a un miembro no compartido requiere una referencia de objeto." Este error se soluciona agregando "Host." delante de la variable.

Ejemplo

Por ejemplo, el siguiente codigo en VB6:

    Private Sub GrialPrintOREC_gpr_PrintDocument()
 
        On Error GoTo ErrH
 
        Dim text_Renamed As String
        Dim CantidadEntregas As Short
        Dim CantidadDestinos As Short
        Dim ArticuloCorte As String
        Dim DetalleArticulo As String
 
        With GrialPrintOREC_gpr
 
            Preejec18Grq.Rst.Sort = "NumRenglon"
            Preejec18Grq.MovePreStart()
            While Preejec18Grq.NextRecord
 
                    'ubico a ver si ese renglon de la gestion esta en este compromiso
                    If GrialPrintOREC_gpr.UserCancel Then Exit Sub
                    If GrillaPe21Grq.Find("RELA_PREEJEC18=" & Preejec18Grq.Rst!ID_PREEJEC18) Then
 
                        If ProveedorCorte <> GrillaPe21Grq.Rst!SOCUSUA15_ENTIDAD Then
                            Gosub CierraProveedor()
                            Gosub AbreProveedor()
                        End If
                        ArticuloCorte = GrillaPe21Grq.Rst!PREFORM15_CODIGO
             End While
 
            Gosub CierraProveedor()
 
            .Printer_Advance(2)
            .Wt(.PrintPos_LeftMargin, encabe, 10000, Print.Align.Left_WordWrap)
            .Printer_Advance()
 
        End With
 
        Exit Sub
 
AbreProveedor:
        ProveedorCorte = GrillaPe21Grq.Rst!SOCUSUA15_ENTIDAD
        Return
 
CierraProveedor:
 
        If ProveedorCorte <> "" Then
            'Imprimo footer del Proveedor
            With GrialPrintOREC_gpr
                .WtCol("Cantidad", "Total: ")
                .WtCol("Total", VB6.Format(TotalAdjudicado, "Currency"))
            End With
 
        End If
 
        TotalAdjudicado = 0
 
        Return
 
 
ErrH:
        MsgError(GrialCont)
        eventArgs.Cancel = True
 
    End Sub

Debe quedar convertido para VB.NET en:

    Private Sub GrialPrintOREC_gpr_PrintDocument()
      On Error GoTo ErrH
      Dim a as New GrialPrintOREC_gpr_PrintDocument_Class
      a.Host = Me
      a.Proc()
      Exit Sub
    ErrH:
      MsgError(GrialCont)
    End Sub
 
    Private Class GrialPrintOREC_gpr_PrintDocument_Class
 
        Public Host as MainForm
 
        Dim text_Renamed As String
        Dim CantidadEntregas As Short
        Dim CantidadDestinos As Short
        Dim ArticuloCorte As String
        Dim DetalleArticulo As String
 
     Sub Proc()
 
        With Host.GrialPrintOREC_gpr
 
            Host.Preejec18Grq.Rst.Sort = "NumRenglon"
            Host.Preejec18Grq.MovePreStart()
            While Host.Preejec18Grq.NextRecord
 
                    'ubico a ver si ese renglon de la gestion esta en este compromiso
                    If Host.GrialPrintOREC_gpr.UserCancel Then Exit Sub
                    If Host.GrillaPe21Grq.Find("RELA_PREEJEC18=" & Preejec18Grq.Rst!ID_PREEJEC18) Then
 
                        If ProveedorCorte <> GrillaPe21Grq.Rst!SOCUSUA15_ENTIDAD Then
                            CierraProveedor()
                            AbreProveedor()
                        End If
                        ArticuloCorte = GrillaPe21Grq.Rst!PREFORM15_CODIGO
             End While
 
             CierraProveedor()
 
            .Printer_Advance(2)
            .Wt(.PrintPos_LeftMargin, encabe, 10000, Print.Align.Left_WordWrap)
            .Printer_Advance()
 
        End With
 
     End Sub
 
     Sub AbreProveedor()
        ProveedorCorte = GrillaPe21Grq.Rst!SOCUSUA15_ENTIDAD
     End Sub 'Return
 
     Sub CierraProveedor()
 
        If ProveedorCorte <> "" Then
            'Imprimo footer del Proveedor
            With Host.GrialPrintOREC_gpr
                .WtCol("Cantidad", "Total: ")
                .WtCol("Total", VB6.Format(TotalAdjudicado, "Currency"))
                .Printer_Advance()
            End With
 
        End If
 
        Host.TotalAdjudicado = 0
 
        End Sub 'Return
 
    End Class

El evento "CheckedChanged" se puede disparar cuando se inicializa el formulario

Lamentablemente el .NET dispara el evento "Changed" de un checkbox o un OptionButton cuando esta haciendo el New del objeto, es decir, mientras se inicializan los controles del Form, e incluso el objeto ni siquiera esta adjunto al Form.

En dichos eventos hay que evitar procesar si el Form aun no está cargado. Hay que ubicar las lineas del tipo:

Private Sub MultiBenefChk_CheckStateChanged(
   ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) 
     Handles MultiBenefChk.CheckStateChanged

Que seria:

Private Sub *_CheckStateChanged(
    ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) 
      Handles *.CheckStateChanged

y en la primer linea de ese sub, agregar:

If Not Created Then Exit Sub

"Created" es una propiedad del Form que esta en False antes de que se muestre el form.

Quedaria por Ejemplo:

Private Sub MultiBenefChk_CheckStateChanged(
   ByVal eventSender As System.Object
  , ByVal eventArgs As System.EventArgs) 
    Handles  MultiBenefChk.CheckStateChanged
 
        If Not Created Then Exit Sub
 
        OcultarMostrar_Segun_MultiBenef()
 
End Sub

Cambia la forma de manejar fechas, el tipo "Date"

En VB.NET se almacenan diferente las fechas.

Ya no funciona Int(Now) para obtener el dia sin Horas y Minutos

En lugar de Int(Now) hay que usar ahora: Now.Date

Para cualquier campo tipo Date se puede usar .Date para obtener el dia sin Horas y Minutos.

Ejemplo

    Private Sub Test_Dates
 
        Dim d1, d2 As Date
        d1 = #3/30/2005 8:00:00 AM#
        d2 = #3/30/2005 1:20:00 PM#
 
        Debug.Print(d1 & ", " & d2) ' Imprime: 30/03/2005 8:00:00, 30/03/2005 13:20:00
        Debug.Print(d1 = d2) ' Imprime: False
        Debug.Print(d1.Date & ", " & d2.Date) ' Imprime: 30/03/2005, 30/03/2005
        Debug.Print(d1.Date = d2.Date) ' Imprime: True
 
 
    End Sub

SelectedNodeRst de un TreeController

En Grial.VB6, para el caso de un TreeController el método .SelectedNodeRst devolvía un Recordset filtrado en en registro del nodo elegido.

En Grial.NET el metodo .SelectedNodeRst devuelve un Grial.Recordset que posee un unico registro y sin filtro. Este recordset es para acceso directo al registro especifico del nodo (contiene solo UNA DataRowView) y no puede utilizarse para recorrer el recordset original con el que se cargó el Tree.

Si se necesita el recordset original de carga, usar la propiedad BindedRecordset


Para nuevos desarrollos

Utilizar los nuevos métodos:

  • .SelectedNodeRow as DataRowView
  • .NodeRow(node) as DataRowView

Que directamente devuelven la DataRowView asociada al nodo.

y no utilizar más los métodos (ahora obsoletos):

  • .SelectedNodeRst as Grial.Recordset
  • .NodeRecord(node) as Grial.Recordset
Herramientas personales