Page 3 of 5
OK you've finally got me, X# is very cool!
Posted: Tue Mar 19, 2019 8:27 am
by Juraj
Hi All
in a visit to chris's post I wrote a similar application for comparison, without using VO, It's written in a core dialect. I replaced DBserver
with OleDB.
Juraj
OK you've finally got me, X# is very cool!
Posted: Tue Mar 19, 2019 8:32 am
by wriedmann
Hi Chris,
just to be clear for anybody else reading this thread, this is only ONE of the ways of how things work in X#.
thank you for your clarification! Sometimes, if you are asking 5 programmers for the solution of a problem, you will get at least 20 different solutions <g>.
I would like to include also this in the XIDE samples if you do not mind.
Of course you can do this! I'll send you an extended version of it later today.
Wolfgang
P.S. sometimes it would be very helpful to create a VS project or solution from an XIDE application, so even VS users could use it
OK you've finally got me, X# is very cool!
Posted: Tue Mar 19, 2019 9:30 am
by Chris
OK, thanks!
About creating a VS solution, well the reason why I used my own format, was because I couldn't stand the VS project system, so I am really not looking forward to understand it and write code to utilize it/save in this format. But of course you are very welcome to write a plugin that does that if you like
OK you've finally got me, X# is very cool!
Posted: Tue Mar 19, 2019 9:44 am
by wriedmann
Hi Chris,
the XPorter/VO creates a VS solution already, so you have the code.... I would have to reverse engineer the needed files.
If you can give me the code how you create a VS project, I will build the plugin <g>
Wolfgang
P.S. I remembered I had the source to the Xporter somewhere, and in fact, I have an old version of it, so I could take this as sample, if you agree
OK you've finally got me, X# is very cool!
Posted: Tue Mar 19, 2019 10:30 am
by Chris
Hi Wolfgang,
Please have a look at your XSharpVOXPorterTemplates folder, and open the file template_VS.xsproj. As you will see, this is an already existing VS project file (I just created a new test project in VS and copied the project file), it just has a few wholes for inserting the files and references created by VOXPorter, which uses this file as a template.
So, no, I do not have code for creating a VS project file, only some very simple one to insert files and references. And even for that, I have simply hard coded inside the VOXporter the text that VS expects, just copied it again from an existing project file
You can find the complete VOXporter code here:
https://github.com/X-Sharp/XSharpPublic ... /VOXporter
OK you've finally got me, X# is very cool!
Posted: Tue Mar 19, 2019 10:34 am
by wriedmann
Hi Chris,
thank you very much! I will do that.
I have only too limited time to dedicate it to reverse engineering of the VS project files.
Wolfgang
OK you've finally got me, X# is very cool!
Posted: Fri Mar 22, 2019 11:41 pm
by FoxProMatt
Wolfgang -
Thanks for the sample app and data. I was able to get the app running from XIDE and the DBFs.
- 2019-03-22 18_38_42-Window.png (99.17 KiB) Viewed 623 times
OK you've finally got me, X# is very cool!
Posted: Sat Mar 23, 2019 12:01 am
by FoxProMatt
Wolfgang -
I have studied this code, and while I can say as a VFP and C# coder, new to X#, it is indeed easy to follow what the code is doing, *however*, that sure is a LOT of code to get data from a DBF. You went to a DataTable, which I think is a .Net thing, right? In VFP we just say:
Code: Select all
USE SomeTable.DBF Alias MyData
Grid.Recordsource = "MyData"
This code sample iterates over every column in the table and every row in the table to build a DataTable, which is probably disconnected from the original DBF where the data came from.
So what paradigm am I missing, where I desire to bind a UI grid directly to a live DBF, or a cursor from a SQL Query?
Code: Select all
Static Method GetCustomerTable() As DataTable
Local oCustomer As DataTable
Local oServer As DBServer
Local nField As Int
Local nFCount As Int
Local aFields As Array
Local cFieldName As String
Local oRow As DataRow
oCustomer := DataTable{ "Customer" }
oServer := DBServer{ System.IO.Path.Combine( ProgSettings.DataPath, "Customer.dbf" ), True, True, ProgSettings.DefaultRDD }
oServer:SetOrder( "Cust1.ntx" )
oServer:GoTop()
nFCount := oServer:FCount
aFields := ArrayNew( nFCount )
For nField := 1 UpTo nFCount
cFieldName := Proper( oServer:FieldName( nField ) )
aFields[nField] := cFieldName
oCustomer:Columns:Add( cFieldName, System.Type.GetType( "System.String" ) )
Next
While ! oServer:EOF
oRow := oCustomer:NewRow()
For nField := 1 UpTo nFCount
cFieldName := aFields[nField]
If IsString( oServer:FieldGet( nField ) )
oRow[cFieldName] := AllTrim( oServer:FieldGet( nField ) )
Else
oRow[cFieldName] := AsString( oServer:FieldGet( nField ) )
EndIf
Next
oCustomer:Rows:Add( oRow )
oServer:Skip()
End
oServer:Close()
Return oCustomer
OK you've finally got me, X# is very cool!
Posted: Sat Mar 23, 2019 4:08 am
by lumberjack
Matt,
Yes that is a "hardcoded" approach for a specific customer table.
However, here is the beauty of X#. XSharpPublic contain the runtime source code. I will push a function DbDataTable soon and also have this feature in the OOP implementation DbServer.
Code will change to:
Code: Select all
USE SomeTable.DBF ALIAS Alias
oGrid:DataSource := DbDataTable()
Or:
Code: Select all
oCust := DbServer{<pars>, "SomeTable.DBF", <pars,...>, "Alias"}
oGrid:DataSource := oCust:DataTable()
Just remember there are very few people coming from VO that use the COMMAND/Functional DBF approach these days, most are using the OOP implementation.
Hope this satisfy your concern,
OK you've finally got me, X# is very cool!
Posted: Sat Mar 23, 2019 5:46 am
by wriedmann
Hi Matt,
that sure is a LOT of code to get data from a DBF.
yes, you are right about this.
But my code (one static function) is a connection between two worlds: the DBServer as VO data object to the .NET datatable.
Therefore it needs some connection code.
And if you look at my code, you see that there is no assumption of a data structure, and there could be one static function that takes a filename and returns a datatable - in fact my code is written so it is generalized.
If the DBServer would be understand SQL statements as the relative object in VFP does, it could be written in a select statement.
Wolfgang