|
|
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
Есть в программе такая вещь: Private ReceptItemsDC As New ADODB.Recordset ReceptItemsDC.Open "SELECT " ... "FROM ... "WHERE .. ", DC, adOpenDynamic, adLockOptimistic, adCmdText ReceptItemsDC.Fields("FullCost") = 100 ReceptItemsDC.UpdateBatch adAffectCurrent 'ReceptItemsDC.Update ReceptItemsDC.Requery ReceptItemsDC.MoveLast База Аксесовская . При работе в сети - если делается это одновременно, то происходит пересечение пользователей. заносятся рецепты - и если добавлять одновременно медикаменты - то у одного пользователя добавится и свой медикамент и медикамент другого пользователя. а у того - вообще ничего нет. чувствую,что дело в Requery. Хотя может и нет Подскажите, что делать Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 12:03 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
Что значит "добавится у одного пользователя"? Запись добавилась в таблицу, ну и хорошо. Где видно, что она добавилась у этого пользователя, а не у другого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 12:07 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
попробую обьяснить подробнее: с одной базой работают два пользователя. заносят рецепты. Если делается это одновременно, то когда добавлен из списка медикамент в этот рецепт (у каждого свой) и нажимаем кнопку "Ввод", то происходит следующее. Это мы отследили по дебаггеру. Значит идут проверки, и когда все данные удовлетворяют (у каждого пользователя свои), доходим до Requery. После этого у кого вперед произойдет это событие, тому копируются все медикаменты другого пользователя, и свои остаются. А у другого, который позже начинает Requery рецепт сохраняется, но в нем нет медикаментов - они у первого пользователя. Мож текст программы будет понятней: Private Sub UpdateDrugList_Click() Dim strTmp As String, varTmp(2) As Variant Dim dblCorrect As Double, lOldRI_FullCost As Long Dim IsItError As Boolean IsItError = False If DrgCode = 0 Then MsgBox "Не введен медикамент", vbCritical, "Ошибка" IsItError = True AddMedical.SetFocus End If If Not IsNumeric(AmmountText.Text) Then MsgBox "Не введено количество", vbCritical, "Ошибка" IsItError = True AmmountText.SetFocus End If If (CVar(AmmountText.Text) <= 0) Then MsgBox "В поле ""КОЛИЧЕСТВО"" нужно ввести положительное число (Например: 54,67)", vbCritical, "Ошибка!" IsItError = True AmmountText.SetFocus End If ' Call AmmountText_Validate(True) If Not IsItError Then 'Basic глючит с типами, т.е иногда 1>1 и разница составляет в ~1e-15 ' => пришлось ввести корректировочный член dblCorrect dblCorrect = Abs(CDbl(AmmountText.Text) - CDbl(IAmmountText.Text)) If (dblCorrect > 0.00000001) Then dblCorrect = 0 'Чтобы к-во не больше остатка для случая постановки рецепта в очередь If (CDbl(AmmountText.Text) > (CDbl(IAmmountText.Text) + TAmmount + dblCorrect)) And StackCheck.Value = vbUnchecked Then MsgBox "Количество больше остатка", vbCritical, "Ошибка" AmmountText.SetFocus Exit Sub End If 'Для нового рецепта If UpdateType = False Then If DrugsUpdateType = False Then 'Новая запись или корректируем старую ReceptItemsDC.AddNew End If 'Значения If StackCheck.Value = vbUnchecked Then ReceptItemsDC.Fields("ItemCode") = NewItmCode ReceptItemsDC.Fields("IDrugCode") = DrgCode ReceptItemsDC.Fields("Ammount") = CDbl(AmmountText.Text) ReceptItemsDC.Fields("RiOutPrice") = CCur(OutPriceText.Text) ReceptItemsDC.Fields("ItemCode") = NewItmCode 'новый код остатков ReceptItemsDC.Fields("SumForPeople") = CCur(SummChargeText.Text) ReceptItemsDC.Fields("FullCost") = CLng(CDbl(SummaryText.Text) * 100) ReceptItemsDC.Fields("IsUpdated") = False rsBaseOperation.Fields("FullCost") = ReceptItemsDC.Fields("FullCost") ReceptItemsDC.UpdateBatch adAffectCurrent 'ReceptItemsDC.Update ReceptItemsDC.Requery ReceptItemsDC.MoveLast End If 'Для текущего рецепта If UpdateType = True Then 'Новая запись или корректируем старую If DrugsUpdateType = False Then ReceptItemsDC.AddNew lOldRI_FullCost = 0 Else lOldRI_FullCost = ReceptItemsDC.Fields("FullCost") End If 'Значения If StackCheck.Value = vbUnchecked Then ReceptItemsDC.Fields("ItemCode") = NewItmCode ReceptItemsDC.Fields("ReceptCode") = ReceptCode ReceptItemsDC.Fields("IDrugCode") = DrgCode ReceptItemsDC.Fields("ItemCode") = NewItmCode 'новый код остатков ReceptItemsDC.Fields("RiOutPrice") = CCur(OutPriceText.Text) ReceptItemsDC.Fields("SumForPeople") = CCur(SummChargeText.Text) ReceptItemsDC.Fields("Ammount") = CDbl(CVar(AmmountText.Text)) ReceptItemsDC.Fields("IsUpdated") = True ReceptItemsDC.Fields("FullCost") = CLng(CDbl(CVar(SummaryText.Text)) * 100) ReceptItemsDC.Update 'должно быть в конце иначе перескакивает на др строчку и считатет х-ню ReceptItemsDC.Requery ReceptItemsDC.MoveLast End If End If End Sub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 12:25 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
ReceptItemsDC.UpdateBatch adAffectCurrent - лишний (ты открыл набор как adLockOptimistic, а не adLockBatchOptimistic) 'ReceptItemsDC.Update - сними комментарий. Этого достаточно для сохранения ReceptItemsDC.Requery - лишний ReceptItemsDC.MoveLast - лишний и создай единую транзакцию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 12:33 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
автору кого вперед произойдет это событие, тому копируются Блин. Копируются куда??? Это не одна таблица??? Я повторяю свой вопрос: Где видно, что она добавилась у этого пользователя, а не у другого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 12:36 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
нет - таблица одна - ReceptItems. и База общая. Для одного рецепта в этой таблице существует столько же записей, сколько в нем медикаментов. 1 - пользователь - выбрал клиента, врача(неважно), затем выбирает медикаменты со склада - например Адельфан 2 - пользователь - выбрал другие данные, и затем выбирает медикамент - Анальгин. Одновременно нажимаем - "Сохранить рецепт". Доходим до Requery. 1 польз. нажал немного раньше 2-го: После этого - в таблице ReceptItems появятся 2 записи для 1 пользователя. Рецепт-1 адельфан Рецепт-1 Анальгин Для 2-го пользователя будет запись: Рецепт-2 Пусто. Что делать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 12:52 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
Да блин ты наверняка с идентификаторами намудил хде-то Сначала каким-нибудь DMax-ом получаешь новый, потом с ним и сохраняешь Ясен перец что у тебя получается ситуация, когда два пользователя один и тот же ID-шник для основной таблицы получают, вот у тебя состав и уползает из одного в другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 13:01 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
БЛИН!!! авторпоявятся 2 записи для 1 пользователя Что такое записи для 1 пользователя?????????? Чем они отличаются от записей для 2 пользователя????????????????????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 13:01 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
короче дело немного даже не так: заносится рецепт, потом для него добавляются медикаменты которые отображаются в ДатаГриде. Нажимаем "Добавить", ставим кол-во,цена, стоим-ть. При нажатии на кнопку "Ввод" он должен отобразится в Гриде. Нажатие этой кнопки я и описал выше. ReceptItemsDC.AddNew ReceptItemsDC.Fields("IDrugCode") = DrgCode ReceptItemsDC.Fields("Ammount") = CDbl(AmmountText.Text) ReceptItemsDC.Fields("RiOutPrice") = CCur(OutPriceText.Text) ReceptItemsDC.Fields("ItemCode") = ItmCode ReceptItemsDC.Fields("SumForPeople") = CCur(SummChargeText.Text) ReceptItemsDC.Fields("FullCost") = CLng(CDbl(SummaryText.Text) * 100) ReceptItemsDC.Fields("IsUpdated") = False ReceptItemsDC.UpdateBatch adAffectCurrent ReceptItemsDC.Requery ReceptItemsDC.MoveLast в предыдущих сообщ. я ошибся - данные не сразу сохраняются в таблицу ReceptItems, а запоминаются и сохраняются позже при сохранении всего рецепта. Но дело в том, что после вызова Requery - у одного пользователя в ДатаГриде отобразится и свой медикамент и медикамент, который вводится другим пользователем, а у того - пустая запись. Мож я конечно плохо обьясняю. >Лох Позорный >Да блин ты наверняка с идентификаторами намудил хде-то Я мож тебя неправильно понял. Ты имеешь ввиду, что идентификатор записи таблицы одинаковый получают одновременно два польз. ? И еще - я понял, что Requery убирать нельзя (если только чем-ньть заменить), потому что когда его нет, в ДатаГриде отображается неполная информация - какие-то данные есть каких-то нету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 13:33 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
Автор принципиально не отвечает на мой вопрос. Лох, ты сможешь объяснить мне, что ты понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 13:35 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
автор писалЯ мож тебя неправильно понял. Ты имеешь ввиду, что идентификатор записи таблицы одинаковый получают одновременно два польз. ? Судя по симптомам - да. А вообще это я у тебя должен спрашивать. Я ж не знаю как ты идентификаторы получаешь, мне NewItmCode мало что говорит. 2 Саныч Насколько я понял, у него при одновременной работе двух юзеров состав одного нового документа (от 1-го юзера) влезает в состав другого нового документа (от 2-го юзера). Непонятно что с шапками происходит. Ну да и хрен бы с ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 13:45 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
еще раз : когда нжимается кнопка ввода медикамента в рецепт, то выполняется ReceptItemsDC.AddNew т.е. добавление новой записи в Рекордсет. Полям присваиваются значения. Причем есть поле "Code"-счетчик, значение которого никак не может совпадать с другой записью. NewItmCode - это не идентификатор. Это код остатка медик-та - короче он не важен. ReceptItemsDC.Fields("IDrugCode") = DrgCode - код медик-та ReceptItemsDC.Fields("Ammount") = CDbl(AmmountText.Text) - кол-во ReceptItemsDC.Fields("RiOutPrice") = CCur(OutPriceText.Text) - цена ReceptItemsDC.Fields("ItemCode") = ItmCode - код остатка медикамента ReceptItemsDC.Fields("SumForPeople") = CCur(SummChargeText.Text) - сумма ReceptItemsDC.Fields("FullCost") = CLng(CDbl(SummaryText.Text) * 100) - полная сумма ReceptItemsDC.UpdateBatch adAffectCurrent ReceptItemsDC.Requery ReceptItemsDC.MoveLast И при Requery происходит пересечение пользователей. Причем если потом сохранить эти оба рецепта, то в эту общую базу занесутся такие записи: 1 рецепт и со своим медикаментом и с медикаментом 2 рецепта а второй так и будет пустым. короче лажа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 14:04 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
>короче лажа. Да. У тебя лажа. Полная. А как таблицы Рецепт и Медикамент связаны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 14:16 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
Да ептттттттты пальцем можешь показать где у тебя происходит установка связи "рецепт"-"медикамент"??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 14:17 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
короче ReceptItems - это и есть медикаменты рецепта. для понятности приведу поля этой таблицы: Code - Счетчик receptCode - Код для связи с табл. Recept(табл. хранения рецептов) ItemCode - Код для связи с табл. Items (табл. остатков) DrugCode - Код медикамента OutPrice - Цена Ammount - Кол FullCost - Стоим-ть полная SumForPeople - Стоим-ть Если есть в рецепте два медик-та - то в это табл. и будет две записи. и ReceptCode - будет в обоих одинаков. Когда выберется из КомбаБокса - медикамент, то его код присвоится DrugCode, и остальные поля также по связям с Items(остатки). DrgCode = ItemDC.Fields("DrgCode") DrugNameText.Text = ItemDC.Fields("LongName") IAmmountText.Text = ItemDC.Fields("Ammount") OutPriceText.Text = ItemDC.Fields("OutPrice") IFullCostText.Text = ItemDC.Fields("IFullCost") И через эти переменные потом присваиваются значения для ReceptItemsDC. Только я не понимаю - зачем вы это спрашиваете. Дело явно не в них. Тут все дело в "Методах обновления данных". Update, Requery и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 14:44 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
Все. Это не лечится. Меняй профессию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 14:57 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
Перевожу с русского на : Вас спрашивают, откуда Вы берете значение переменной ReceptCode, которое присваивается в строке: ReceptItemsDC.Fields("ReceptCode") = ReceptCode !Ибо поиск по текущей странице не дает представления о СПОСОБЕ получения этой величины ВАШЕЙ процедурой. А результат, описанный Вами однозначно указывает, что вы присваиваете обоим наборам медикаментов (у обоих пользователей) ОДИН И ТОТР ЖЕ КОД ReceptCode. Все остальное не имеет отношения к проблеме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 15:28 |
|
||
|
Пересечение пользователей
|
|||
|---|---|---|---|
|
#18+
2фыыф >Все остальное не имеет отношения к проблеме. А как же хранение в таблице ВыписанныеРецепты полей FullCost - Стоим-ть полная и на%%я связь с таблицей Остатков (ItemCode) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 15:40 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32341879&tid=1677870]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 411ms |

| 0 / 0 |
