Содержимое VFP ComboBox из таблицы SQL Server 2005 Express - PullRequest
0 голосов
/ 14 сентября 2011

Я все еще новичок в VFP, я ищу советы и предложения о том, как перетаскивать поля таблицы SQL Server в VFP combobox (или другие объекты, если это лучше), как автоматическое заполнение, но из sql база данных сервера.

У меня около 2 столбцов и 1000 строк внутри таблицы, в поле со списком должно отображаться только поле второго столбца, которое пользователь может выбрать, но использовать выбранное поле первого столбца для записи в другую таблицу. Я надеюсь, вы поняли идею.

Заранее спасибо за Ваш отзыв.

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

Я бы справился с этим немного по-другому, так как вы хотите ОБА столбцы .. один показан, а другой для фактических данных.Комбоксы могут быть напрямую связаны с таблицей или курсором (курсор является не чем иным, как временной таблицей, которая автоматически стирается при закрытии).

В INIT () вашего комбобокса я бы запустил ваш запрос к вашему SQLбазы данных, но просто возьмите эти два столбца ...

* -- Try to connect and get a connection handle.
lnHandle = Sqlstringconnect( YourConnectionString )
if lnHandle < 1
  */ Return, get out, unable to get handle to SQL server
  messagebox( "Unable to connect to SQL" )
  return
end 

lcSQLCmd = "Select ShowThisColumn, ButUseThisColumn from YourDatabase.dbo.YourTable"
lnSQLResult = SQLExec( lnHandle, lcSQLCmd, "C_ChoicesFromSQL" )
sqldisconnect( lnHandle )
if lnSQLResult < 1
  messagebox( "Unable to retrieve data" )
  return
endif

*/ Ok, we have the data, now the binding.  VFP Can set the row source directly
*/ to the ALIAS ("C_ChoicesFromSQL") from the SQL query directly, no need to scan
*/ and add items.  Just tell it both columns.
This.ColumnCount = 2   && You will bind BOTH columns to the combobox
This.BoundColumn = 2   && You want the data from the SECOND column bound for storage
This.BoundTo     = .T.  && Yes, bind to whatever the Control Source of the combobox

*/ Here's the trick.  Set the column widths = whatever you have visible on the form
*/ for the first column, and  the second column has a visible width of 0
This.ColumnWidths = alltrim( str( This.Width )) + ",0"

*/ Now, the row source... 
This.RowSource = "C_ChoicesFromSQL.ShowThisColumn, ButUseThisColumn"
This.RowSourceType = 2  && bound to alias

*/ Fixed dropdown LIST, dont allow others to type in their own values
*/ but only choose from the data available in your source.
This.Style = 2 
0 голосов
/ 16 сентября 2011

Хорошо, вот как я бы сделал это программно, предполагая в форме комбинированный список с именем «cboSQL» и этот код в методе Init () формы (это только один столбец в комбо, но проверка справки VFP в AddItem()):

Local lnHandle, lnResult As Integer
Local lcConnstring, lcCommand As String
Local llReturn As Boolean

    * -- Do the default behaviour.
    llReturn = DoDefault()

    If llReturn

        * -- Try to connect to a local SQL Express 2008 instance.
        lcServername = ".\SQLEXPRESS"
        lcDbname = "umbraco"
        lcConnstring = [server=]+ lcServername+ [;driver={SQL Server};database=]+ lcDbname
        lcConnstring = lcConnstring + [;DSN='';Trusted_Connection=Yes]

        * -- Try to connect and get a connection handle.
        lnHandle = Sqlstringconnect(lcConnstring)

        * -- Got a connection ?
        If lnHandle > 0

            * -- Run a query, put the results in a VFP cursor called 'results'.
            lcCommand = "select top 1000 logComment from [umbraco].[dbo].[umbracoLog]"
            lnResult = SQLExec(lnHandle, lcCommand, "results")

            If lnResult = -1
                Messagebox("Error running SELECT.", 48, "Error!")
            Else

                * -- Got some rows, populate combobox.
                Select results
                Scan

                    * -- Transform() just stringifies the column.
                    Thisform.cboSql.AddItem(Transform(results.logComment))

                Endscan

            Endif

            * -- Tidy up.
            Use In Select("results")
            SQLDisconnect(lnHandle)

        Else

            Messagebox("Couldn't connect to server.", 48, "Error!")
            llReturn =.F.

        Endif

    Endif

Return llReturn
...