|
|
|
| Привет все.
Народ, наведите на мыслю. Есть свободная форма с полями "Надпись1....17", "ПолеL1...17", полеN1....17", "ПолеW1...17", "REZ1...17" которые при открытии заполняются из таблицы, если есть данные или остаются пустыми, если данных нет. В процессе работы заполняются поля, изменяются некие данные что загрузились из таблицы, происходят вычисления. Теперь все то, что там записалось, вычислилось и изменилось, требуется сохранить в таблицу. Циклом могу собрать данные, которые имеют результаты <>0 (поле REZ1...17) Как-то построчно надо по этой форме пройтись по всем 17 строкам. Форма не ленточная. recordset что ли как-то присобачить или все же циклом? И как из этого состряпать некий запрос, скажем на добавление или изменение. Или и то и другое вместе взятое? | |
|
| |
|
|
|
| А табла какую структуру имеет?
хоть пример забабахай а то не удобственно как-то придумывать | |
|
| |
|
|
|
| Да вот с этим как раз работаю. Ща выдерну из базы минимум, скину. | |
|
| |
|
|
|
| для одной строки
docmd.runsql "INSERT INTO Таблица1 ( Поле1, Поле2 ) SELECT [Forms]![форма1]![поле0] AS Поле1, [Forms]![форма1]![поле8] AS Поле2;" | |
|
| |
|
|
|
| Думал на эту тему. Все закинуть в цикл для всех строк. Проблема еще в том, что бы если изменять данные, то запускать запрос на обновление, что бы не добавлять лишнюю инфу в таблицу. И вот тут-то и загвоздка. Как-то рекордсет надо что ли для сравнения что есть и что в форме. Или при открытии как-то значение присваивать. Или при сохранении пробежать по тому, что уже есть и сравнить-обновить а затем добавить недостающее. В общем каша полная. А может это и есть решение? | |
|
| |
|
|
|
| Все что мог удалил, оставил выжимку, но и она в архиве 200кб. Пришлось на залить http://zalil.ru/32048198 Гляньте кто может? | |
|
| |
|
|
|
| Вон снайпер тебе классную штуку написал | |
|
| |
|
|
|
| Да вот пока еще недопонял. Пытаюсь разобраться применительно к себе. | |
|
| |
|
|
|
| Здрасти.....
Он тебе советует запросом на обновление вставлять данные в таблицу, а брать их с полей на форме.
---------------------------------
теперя врубаисси?
сохранять надо из результаты?
или L в L
INSERT INTO Биометрия ( L )
SELECT [Forms]![Расчет биометрии]![L1] AS Выражение1 | |
|
| |
|
|
|
| У меня примерно так и работает. CurrentDb.Execute "insert into Биометрия (КодПротОбл, Параметр, L, H, W, T) values ('" & Me.Поле1 & "', '" & Me("Надпись" & i).Caption & "', " _
& " " & Nz(Me("L" & i), 0) & ", " & Nz(Me("H" & i), 0) & ", " & Nz(Me("W" & i), 0) & ", " & Nz(Me("T" & i), 0) & ");"
И добавляет. Но проблема в том, что надо определить (рекордсетом или как-то еще) что уже введено, сравнить с тем, что есть и далее программно где-то запускать запрос на обновление, а если новый параметр добавился, то еще и на добавление.
Проблема в механизме всего этого. На обновление можно запускать в любом случае по имеющимся в таблице строкам. А если их в таблице меньше, чем заполнено в форме, то недостающие запросом на добавление.
Так вот на обновление в цикле не катит. Он то по последней строке бьет, то все по первой обновляет. Может передавать в форму еще и данные id и ссылаться на текущий в цикле id по условию... В общем поиск решения. | |
|
| |
|
|
|
| Все сделал! Сам же себя на мыслю и навел. Вот как оно работает: ID при открытии формы заполняется где оно есть. Далее заполняем форму, затем закрываем. ПРи закрытии пробегаем по всем строкам формы. Там где id заполнен, там он выступает в роли условия запроса на обновление результата. Там, где его нет, срабатывает запрос на добавление, после чего рекордсетом (новых строк может быть много добавлено) ставим новое знаение id в соответствующую строку, после чего по ней может работать только обновление. УСЕ
a = DCount("Параметр", "[Спр Биометрия]", "ОблИсследования='" & [Forms]![Пациенты]![подчиненная форма Протокол область].[Form]![ОбластьИсследования] & "'")
DoCmd.SetWarnings False
For i = 1 To a
If (Nz(Me("rez" & i), 0) <> 0 Or Nz(Me("L" & i), 0) <> 0 Or Nz(Me("H" & i), 0) <> 0 Or Nz(Me("w" & i), 0) <> 0 Or Nz(Me("T" & i), 0) <> 0) And Nz(Me("id" & i), 0) = 0 Then
CurrentDb.Execute "insert into Биометрия (КодПротОбл, Параметр, L, H, W, T) values ('" & Me.Поле1 & "', '" & Me("Надпись" & i).Caption & "', " _
& " " & Nz(Me("L" & i), 0) & ", " & Nz(Me("H" & i), 0) & ", " & Nz(Me("W" & i), 0) & ", " & Nz(Me("T" & i), 0) & " );"
Set rst = CurrentDb.OpenRecordset("SELECT Биометрия.КодБиометрии, Биометрия.Параметр, Биометрия.L, Биометрия.H, Биометрия.W, Биометрия.T, " _
& " [Протокол область].КодПротОбл FROM [Протокол область] RIGHT JOIN Биометрия ON [Протокол область].КодПротОбл = Биометрия.КодПротОбл " _
& " WHERE ((([Протокол область].КодПротОбл)=" & [Forms]![Пациенты]![подчиненная форма Протокол область].[Form]![КодПротОбл] & "));")
With rst
Do While Not .EOF
Me("id" & i) = !КодБиометрии
.MoveNext
Loop
End With
Else
If (Nz(Me("rez" & i), 0) <> 0 Or (Me("L" & i) <> 0 Or Nz(Me("H" & i), 0) <> 0 Or Nz(Me("H" & i), 0) <> 0 Or Nz(Me("T" & i), 0) <> 0)) And Nz(Me("id" & i), 0) <> 0 Then
MsgBox ("Обновляем значение" & " " & Me("Буква" & i))
DoCmd.RunSQL "UPDATE Биометрия SET Биометрия.L = " & Me("L" & i) & ", Биометрия.H = " & Me("H" & i) & ", Биометрия.W = " & Me("W" & i) & ", " _
& " Биометрия.T = " & Me("T" & i) & " WHERE (((Биометрия.КодБиометрии)=" & Me("id" & i) & "));"
End If
End If
Next i | |
|
| |
|
|
|
| Ах ты вон чего спрашивал..........
Я тады просто вопроса не понял
Звиняюся за пестолковости | |
|
| |
|
|
|
| Ну наверно не так изложил проблему. Нужен был механизм всего этого. А так, в базе работает немного видоизмененная ваша функция. Очень пригодилась.
| |
|
| |