Welcome To The Home Of The Visual FoxPro Experts  
home. signup. forum. archives. search. google. articles. downloads. faq. members. weblogs. file info. rss.
 From: Samir Ibrahim
  Where is Samir Ibrahim?
 Samir Ibrahim
 To: Stefan Wuebbe
  Where is Stefan Wuebbe?
 Stefan Wuebbe
Subject: RE: VFP Wait Window in .NET
Thread ID: 415928 Message ID: 416106 # Views: 37 # Ratings: 0
Version: Unknown Category: .NET
Date: Sunday, December 21, 2014 7:49:51 PM         

> > Sorry for the late to answer, I was busy converting VFP code to VB.NET and finally I managed to made Locate() Continue() work in vb.net.
> >
> > As usual, the good thing it works, the bad thing I did not like it (lol)
> < grin >
> How did it look so that you did not like it?
> Without knowing anything about your requirements, in .Net did you do something like retrieving data rows from the back-end "as usual", and then say the "Locate" / "Found" part would be if the record set result's Count is greater than zero, and the "Continue" part would be a "foreach" loop as soon as Count is greater than one?
> Regards
> -Stefan

Hi Stefan

The point of this class is ... humm.. you can call it copy/paste vfp code logic, make it run and gives the same result that vfp gives without the need to re-create the logic in .Net

I had made a project 9 years ago, they are still using it so far, but I wanted to make it part of my ERP, and it contains a accounting logic that i remember it took me long time to understand to make in vfp, so now i want to transfer it AS IS.

My class usage is like this

Dim dt as New Datatable = ...... (Get your datatable)
Dim oTable as New VFPTable
oTable.Locate("farm_num = @p1 AND flock_num = @p2",{1000,59})
Do While oTable.Found()

I want 2 things from the class, A-give me correct result, B- simple accessing data in it

As can see from the code above, I am accessing the data by using oTable("frm_name")

I spend sometime trying to figure how to access the data, If my class is based on Datatable, I had to access the data by oTable(0)("frm_name") and i don't want use (0) brackets neither I want oTable.Rows(0)("field_name")

The only object I found that enables me from using Object("Field_Name") is the datarow, but
I did not manage to inherit my class from Datarow, It has no constructor, and I found a code to make constructor, but I could not intialize it.

I ended up creating my class base on "Hashtable"

With each Continue(), I had to copy the current row to be the first object in my Hashtable object and access it. Doing large operatrion it time wasting (but my currect project has maximum of 3000 row) and will not increase (I had 30 chicken Farm, each farm has 2-6 floors, each Farm..Floor which called Floc has 45 record)

Class Usage

'Do While Found() Example
        Dim oTable As New VFPTable(MyDataset.FLOCK)
        With oTable
            .Locate("frm_num = @p1",{33})
            do While .Found()
        End With

        ' If Found() Example
        oTable.Locate("frm_num = @p1 and flk_num = @p2 and floor = @p3",{42,60,2})
        If oTable.Found()
            MsgBox("Not Found")
        End If
        ' Sum Example
        Dim MySum = oTable.Sum("flk_count","frm_num = @p1 AND floor = @p2",15,1)

The Class

    Public NotInheritable Class VFPTable
        'Inherits DataRow
        'Inherits BindingSource
        'Inherits DataRow
        Inherits Hashtable
        Property Rows As DataRowCollection
        Property Table As DataTable
        Property Row As Object 
        Property Found As Boolean
        Property RecNo As Integer
        'Property x As New Collection
        Private _dtrow As DataRow
        Private _dvrow As DataRowView
        Private _defaultview As DataView
        Private _locateview As DataView
        Private _record_index As Integer
        Private _locatefound As Boolean
        Private bs As New BindingSource
        Private _primary_keys() As String
        Private _EOF As Boolean
        Property EOF As Boolean
            If RecNo = _locateview.Count
                Return True
                Return False
            End If
        End Get
        Set(value As Boolean)
            _EOF = value
        End Set
        End Property

  ' Necessary only if you want to use your row in the Grid Designer
        Sub New(ByVal dt As DataTable, ParamArray PrimaryKeys() As string)
            Table = dt
            bs.DataSource = dt.DefaultView
            Rows = Table.Rows
            _defaultview = Table.DefaultView
            _locateview = New DataView(Table)
            _primary_keys = PrimaryKeys
        End Sub
        Sub New()
        End Sub
        Sub Use(ByVal dt As DataTable)
            Table = dt
            bs.DataSource = dt.DefaultView
            Rows = Table.Rows
            _defaultview = Table.DefaultView
            _locateview = New DataView(Table)
        End Sub

        Function Reccount() As Integer
            Return Table.Rows.Count
        End Function

        Function [Goto](ByVal RecordNo As Integer)
            bs.Position = RecordNo
            'Row = Table.Rows(RecordNo)
            Row = _locateview(RecordNo -1)
            RecNo = RecordNo
        End Function
        Private Function _AddRowToCollection()
            For i = 0 to Table.Columns.Count -1
                Dim field_name = table.Columns(i).ColumnName
        End Function
        Function Locate(ByVal tcFilterExpr As String,toParameters() As Object)
            Dim filter_expr = tcFilterExpr
            Dim param_expr = ""
            For i = 0 to toParameters.Length - 1
                param_expr = "@p"+ (i+1).ToString
                filter_expr = filter_expr.Replace(param_expr,toParameters(i))
            _locateview.RowFilter = filter_expr
            If _locateview.Count > 0
                Found = True
                Row = _locateview(0)
                bs.DataSource = _locateview
                bs.Position = 0
                RecNo = 1
                Found = False
                RecNo = 0
            End If
            _record_index = 0
        End Function
        Function [Continue]()
            RecNo = RecNo + 1
            _record_index = _record_index + 1
            bs.Position = _record_index
            If RecNo = _locateview.Count + 1
                EOF = True
                Found = False
            End If

        End Function

        Sub  Skip(ByVal tnRecords As Integer)
            Dim new_rec_no = RecNo + tnRecords
            bs.Position = new_rec_no
            Row = bs.Current.Row
            _record_index = RecNo-1 + tnRecords
            RecNo = new_rec_no
        End Sub

        Function Sum(tcFieldToSum As String, tcExpression As String, ParamArray tcParameters() As String) As Double
            Dim sum_expr = ""
            Dim expr = tcExpression
            For i = 0 To tcParameters.Length - 1
                expr = expr.Replace("@p" + CStr(i + 1), tcParameters(i))
            sum_expr = "Sum(@p1)".Replace("@p1", tcFieldToSum)
            Dim answer = Me.Table.Compute(sum_expr, expr)
            Return answer
        End Function
    End Class

Samir Ibrahim


VFP Wait Window in .NET Posted by Samir Ibrahim @ 12/16/2014 6:00:28 PM
RE: VFP Wait Window in .NET Posted by Stefan Wuebbe @ 12/16/2014 8:28:03 PM
RE: VFP Wait Window in .NET Posted by Samir Ibrahim @ 12/17/2014 9:11:05 AM
RE: VFP Wait Window in .NET Posted by Stefan Wuebbe @ 12/17/2014 5:34:18 PM
RE: VFP Wait Window in .NET Posted by Samir Ibrahim @ 12/20/2014 9:46:52 AM
RE: VFP Wait Window in .NET Posted by Stefan Wuebbe @ 12/21/2014 7:38:52 AM
RE: VFP Wait Window in .NET Posted by Samir Ibrahim @ 12/21/2014 7:49:51 PM
RE: VFP Wait Window in .NET Posted by Stefan Wuebbe @ 12/22/2014 10:55:35 AM