Migracion
De GrialWIKI
(→Cambia la forma de manejar fechas, el tipo "Date") |
(→Para nuevos desarrollos) |
||
Línea 265: | Línea 265: | ||
===Para nuevos desarrollos=== | ===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''' |
- | *'''. | + | |
- | + | ||
- | + |
Revisión de 18:24 5 oct 2010
Contenido |
Notas para la Conversión de VB6 a VB.NET
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:
- Crear una Private Class CorteControl_Class (interna, dentro de la clase actual)
- Colocar las variables generales del "Sub CorteControl" como variables privadas de la "Private Class CorteControl_Class"
- Agregar una propiedad "Dim Host As MainForm" al principio de la nueva clase
- Crear un "Sub Proc()" dentro de la clase y colocar el codigo del "Sub CorteControl"
- Crear un Sub por cada rutina de gosub que existia en el "Sub CorteControl" original
- Por Ejemplo si decia "Gosub Rutina1", crear un "Sub Rutina1" dentro de la clase
- Reemplazar los Gosub, por llamadas a los sub (eliminar la palabra gosub directamente)
- El "Sub CorteControl" original que se reemplaza debe quedar:
- Sub CorteControl()
- Dim a as New CorteControl_Class()
- a.Host = Me
- a.Proc()
- 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 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 (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