powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема помогите!
33 сообщений из 33, показаны все 2 страниц
Проблема помогите!
    #33151928
Денг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня такая проблема:
есть таблица Склад(номер_склада,название),как мне сделать, чтобы при добавлении в склад
нового названия, ему автоматически присваивался следующий номер склада.Например:
у нас имеются записи в таблице (номер_склада:1,2,3 название:Склад1,Склад2,Склад3)вот и мне надо,
чтобы,когда я добавляю склад4 ему присваивался номер_склада=4 и.т.д как это сделать?????
...
Рейтинг: 0 / 0
Проблема помогите!
    #33152059
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДенгУ меня такая проблема:
есть таблица Склад(номер_склада,название),как мне сделать, чтобы при добавлении в склад
нового названия, ему автоматически присваивался следующий номер склада.Например:
у нас имеются записи в таблице (номер_склада:1,2,3 название:Склад1,Склад2,Склад3)вот и мне надо,
чтобы,когда я добавляю склад4 ему присваивался номер_склада=4 и.т.д как это сделать?????
Hi, Денг!
Один из выходов из ситуации.
В базе иметь таблицу с установками/настройками, в которой иметь поле с последним номером склада (Например: Setting.N_sklad).
Следовательно следующий номер склада:
New_n_sklad = 'Склад'+LTRIM(STR(Setting.N_sklad+1))
Только незабыть в таблице Setting увеличить номер склада для дальней работы.
...
Рейтинг: 0 / 0
Проблема помогите!
    #33152140
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для таких вещеё неплохо подходит идеология NewID - присвоение первичного ключа.
...
Рейтинг: 0 / 0
Проблема помогите!
    #33152555
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Calcukate Max(номер_склада) To max_nomer
new_nomer = max_nomer + 1
...
Рейтинг: 0 / 0
Проблема помогите!
    #33152558
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Calcukate - конечно же - CALCULATE
...
Рейтинг: 0 / 0
Проблема помогите!
    #33152676
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Crispy
а если между
Calcukate Max(номер_склада) To max_nomer
new_nomer = max_nomer + 1

и insert ....

кто-то или что-то вклиниться??

типа к королю англии пришел мужик с лопатой и говорит:
- мы с братом прокопаем тунель под ломаншем. Я начну сдесь, а он во франции. Встретимся посередине.
- а если не встретитесь
- ну тогда у Вас будет два тонеля под ломаншем
...
Рейтинг: 0 / 0
Проблема помогите!
    #33153265
Grin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще лучше перейти на VFP8 или VFP9 там есть поле автоинкреминент
...
Рейтинг: 0 / 0
Проблема помогите!
    #33153409
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если буквально по вопросу, то ...

Insert into Склад (номер_склада,название) values (INT(RIGHT(M.название,1)),M.название)
...
Рейтинг: 0 / 0
Проблема помогите!
    #33153452
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvНу если буквально по вопросу, то ...

Insert into Склад (номер_склада,название) values (INT(RIGHT(M.название,1)),M.название)
Где RTRIM?
...
Рейтинг: 0 / 0
Проблема помогите!
    #33153454
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще здесь есть кнопка поиск.
Поиск надо вести по слову NEWID.

Ну, или автоинкремент.
...
Рейтинг: 0 / 0
Проблема помогите!
    #33154179
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi, leaf !
leaf а если между
Calcukate Max(номер_склада) To max_nomer
new_nomer = max_nomer + 1

и insert ....

кто-то или что-то вклиниться??

Ага! Сидят у них там 40 пользователей - и все новые склады создают... - чип-и-дейлы, какие-то, что ли
ИМХО этим всегда занимается кто-то один - тот, кто достаточно упал-намоченный
...
Рейтинг: 0 / 0
Проблема помогите!
    #33154205
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CrispyHi, leaf !
leaf а если между
Calcukate Max(номер_склада) To max_nomer
new_nomer = max_nomer + 1

и insert ....

кто-то или что-то вклиниться??

Ага! Сидят у них там 40 пользователей - и все новые склады создают... - чип-и-дейлы, какие-то, что ли
ИМХО этим всегда занимается кто-то один - тот, кто достаточно упал-намоченный

не надо утрировать задачу, просто leaf показал порочность такого метода, на самом деле , скажем при автонумерации документов можно запросто получить дубликаты номеров.
...
Рейтинг: 0 / 0
Проблема помогите!
    #33154286
WORKSNS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно использовать calculate max() без последствий типа дублирования уникального номера, я поступаю так:

DO WHILE .t.
WAIT WINDOW NOWAIT [Ïîïûòêà äîáàâëåíèÿ çàïèñè....]
ResultCreate=FCREATE('append')
IF ResultCreate>0
EXIT
ENDIF
ENDDO
WAIT CLEAR
CALCULATE MAX(IdRec) TO MaxIdRec
INSERT INTO Test (IdRec,...) VALUES (MaxIdRec+1,...)
=FCLOSE(ResultCreate)
...
Рейтинг: 0 / 0
Проблема помогите!
    #33154302
WORKSNS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, вклеивал просмотрел, что получились крокозяблы :-), в строке с WAIT WINDOW NOWAIT
'Попытка добавления записи'
...
Рейтинг: 0 / 0
Проблема помогите!
    #33154476
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi, PaulWist !

Метод не может быть порочен или непорочен... Просто к каждой задаче нужно подходить индивидуально. Бывают и локальные версии. Бывают и жесткие ограничения на доступ к информации, когда только один человек имеет право ее править. Нельзя же каждый раз пытаться создавать решение "на века", "на все случаи жизни". Все равно все учесть невозможно. А иногда, как мне кажется, например, в данном случае, можно попытаться сделать все попроще. Хотя, полностью согласен, что в других случаях - такая простота может оказаться и совершенно неуместна. Поэтому наверно и не бывает универсальных решений.
...
Рейтинг: 0 / 0
Проблема помогите!
    #33154526
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CrispyHi, PaulWist !

Метод не может быть порочен или непорочен... Просто к каждой задаче нужно подходить индивидуально. Бывают и локальные версии. Бывают и жесткие ограничения на доступ к информации, когда только один человек имеет право ее править. Нельзя же каждый раз пытаться создавать решение "на века", "на все случаи жизни". Все равно все учесть невозможно. А иногда, как мне кажется, например, в данном случае, можно попытаться сделать все попроще. Хотя, полностью согласен, что в других случаях - такая простота может оказаться и совершенно неуместна. Поэтому наверно и не бывает универсальных решений.

Даже не знаю, что и сказать. Пожалуй отвечу цитатой Леса Пинтера: "Ошибок не бывает в природе, есть ситуации для которых программист не предусмотрел проверку" , исходя из такого тезиса, необходимо делать ф-ий программы, которые в дальнейшем приносили бы меньше головной боли.

PS если мои слова вызвали у Вас чувство обиды, тогда прошу прощения.
...
Рейтинг: 0 / 0
Проблема помогите!
    #33154671
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2WORKSNS
оригинально. тоже способ .... это в смысле идеи
а сам цикл где файл создается... короче я бы над ним поработал по крайней мере на первый взляд
я бы всё таки на вашем месте выбрал блокировочку строки в таблице только не таблицы а строки в ней причем табличка не эта а соседняя
и сама функция calculate вряд ли здесь умесна имхо
так как файл имеет идекс по ключевому полю,что для таблиц логично ожидать, то ...
правильно юзаем :
go top или go bottom по ситуации и подбираем искомый максимум
Но опять же кто как любит работать

"Изящным движение руки брюки превращаются в шорты"
...
Рейтинг: 0 / 0
Проблема помогите!
    #33154693
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Crispy
извените ради бога...
но вы зря обижаетесь здесь у вас врагов нет. Слишком уж всё виртуально.
А в споре рождается истина
Код ваш скопировал потому что писать лень, а не потому что поддеть хотел
...
Рейтинг: 0 / 0
Проблема помогите!
    #33154720
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2PaulWist :

Да нет, думаю, все было вполне корректно. :)
Единственное, что я пытался сказать - всего лишь - о сущностях Окамы :)
В остальном же полностью согласен. Кстати, собственные программы Леса Пинтера, которые мне довелось однажды посмотреть в одной из его книг, честно говоря, произвели на меня впечатление... - своей убогостью мысли :). Хотя, конечно же, это только мое личное мнение - на данный момент.

2leaf :

OK!
...
Рейтинг: 0 / 0
Проблема помогите!
    #33155659
WORKSNS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Leaf
Не спорю, кому что нравится, какая ситуация и так далее :-), я просто подкинул идею как приостановить других пока один толкает данные в таблицу, но меня такой способ не подводил. Если насчет скорости, то мне не приходилось работать с очень большими справочниками :-). И у Calculate есть все же небольшой плюс - он не зависит от корректности индекса и наличия оного.
...
Рейтинг: 0 / 0
Проблема помогите!
    #33155839
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi WORKSNS!

Способ (с блокировкой) также не работает при использовании буферизации и/или представлений (писать же программу, даже НЕ сетевую, без использования этих механизмов - это конечно порочная практика, даже во времена FPD делали "эмуляцию" этих полезнейших вещей через SCATTER/GATHER или временные таблицы/курсоры). Теоретически можно "перенести" формирование кода на момент физической записи (написав не в пример более сложный код в точке сохранения конечно), однако практически всегда легче использовать подход NewID.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Проблема помогите!
    #33157065
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi, Igor Korolyov !
Igor Korolyov /topic/145680&hl=newid- я вообще не пользуюсь AUTOINC по
ряду причин, и ничего :)
А интересно, что - вместо?
...
Рейтинг: 0 / 0
Проблема помогите!
    #33157424
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык, Игорь вроде написал ;-)
Igor Korolyov...однако практически всегда легче использовать подход NewID.Я прав, Игорь?
...
Рейтинг: 0 / 0
Проблема помогите!
    #33157433
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или у вас уже сплошь КС со своими сиквенсами?
...
Рейтинг: 0 / 0
Проблема помогите!
    #33157720
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно просто поставить в поле праймери индекса табдицы default=reccount() и после аппенда делать replace sklad with 'склад'+alltr(str(id)). Тогда точно не будет совпадающих номеров складов Но тут уж такой прикол получится: если есть 3 склада и удалишь второй, то потом склад2 уже не создашь - только склад4.
...
Рейтинг: 0 / 0
Проблема помогите!
    #33157818
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lo-pataМожно просто поставить в поле праймери индекса табдицы default=reccount() и после аппенда делать replace sklad with 'склад'+alltr(str(id)). Тогда точно не будет совпадающих номеров складов Но тут уж такой прикол получится: если есть 3 склада и удалишь второй, то потом склад2 уже не создашь - только склад4. И будет тебе счастье... До первого PACK'а ;-)))
...
Рейтинг: 0 / 0
Проблема помогите!
    #33157879
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Urri!

Да, NewID. А Sequence в Oracle - это идеологический родственник NewID :)

2 lo-pata

Делаем PACK и ... отправляем твой способ в сад :) Кроме того при работе с представлениями это опять таки вызовет совсем ненужные проблемы... Чего мудрить то - NewID уже много лет существует и доказал свою надёжность - так ведь нет, надо поизобретать всякий ерунды - от SYS(2015) и прочих самопальных GUID-ов до CALCULATE MAX, RECCOUNT() - ещё бы RECNO() вспомнили :)

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Проблема помогите!
    #33157895
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NewID - не вопрос, но только для тех, кто работает с фоксом после семерки. Я обычно юзаю именно такой метод, какой я описал - именно реккаунт. Но!!!! всегда в программе делается пункт меню "сервис" - в котором есть и конфиг программы (пути к базам прописать) и всегда есть пункт (я так всегда делаю) - типа переиндексация базы или чистка, если хотите. Так там висит код, после которого и записи удаленные убираются и происходит ВСЕГДА проверка остающихся в базе данных. А там уже можно при проверке любые варианты рассмотреть - тут уж от задачи зависит, какие резы и данные, кот в дальнейшем вводиться будут. Так что реккоунт работает гут, но только при условии, что не программер местный каждый раз будет паки запускать и гробить всю нумерацию, а цивильно - юзер жмет пункт меню и выполняется чистка базы, переиндексация - да че угодно, но главное это в сервисах предусмотреть. Если такие вещи (типа переиндексации и пака) в меню предусмотреть - то вмешиваться в базу ручками и не надо будет. Единственное - пишешь инстракшен на листике и раздаешь юзерам, а лучше только юзерам с правами админов, и все. Они знают - раз в месяц надо запустить такой-то пункт меню и все будет супер гут, база будет почищена и раотать будет быстрее. Так что здесь проблем не метода, каким я пользуюсь, а именно сервсных функций, кот будут в программе.
...
Рейтинг: 0 / 0
Проблема помогите!
    #33157969
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2lo-pata
Вообще-то существует такая идеология проектирования баз данных, при которой delete отбрасывается напрочь, и все делается в основном через insert, ну а update остается только для того, чтобы помечать устаревшие записи как утратившие актуальность. Я даже нахожу такой подход очень привлекательным. Но практически он у меня применения не находит, так как всегда находятся ситуации, когда данные проще просто удалить, чем обеспечивать их версионность. Так, для справочника складов (который мы тут мусолим) удалить ненужный склад проще, чем объявить его закрытым для операций (ликвидированным), до тех пор, пока по этому складу не было ни одной складской проводки.
Отсюда можно сделать вывод, что delete в реальной жизни встречаться будет. А описанный тобой подход несет в себе родовые травмы. Потому что если даже программа не предусматривает ни одного pack'а, ситуация, когда pack произойдет, рано или поздно случится. Вот уедут все админы и программеры ваши разом в отпуск - а база в это время упадет. Пригласят человека со стороны для восстановления. А он увидит, что туча удаленных записей в таблицах болтается - и какой будет его первая реакция? Пакануть, конечно. Смешно предполагать при этом, что он предварительно ознакомится с вашей инструкцией, в которой может быть даже 48-м кеглем написано, что этого делать нельзя ни в коем случае. Не тот человек и не та ситуация. А человек еще будет при этом над вами потешаться, что вы все - такие лохи, что даже базу не чистите, он так и не поймет, что такова была идеология ;-)))
...
Рейтинг: 0 / 0
Проблема помогите!
    #33158016
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Urri

Да все такой метод предусматривает - пакуй и удаляй на здоровье. Только я еще раз говорю - не ручками через фокс, а напиши сервисную функцию в проге. Привожу пример:

есть таблица "справочник материалов", есть вторая таблица "сметы".
Метериалы:
mat_id mat_name
1 цемент м400
2 цемент м500
3 кирпич

Сметы:
smet_id smet_name mat_id
1 смета1 1
1 смета1 2
1 смета1 3
2 смета2 1
2 смета2 2

Удаляем цемент м500. перепаковали базу, после пака пробежали по табличке и последовательно перенумеровали коды:

mat_id mat_name
1 цемент м400
2 кирпич

Теперь если дефолт в материалах стоит reccount()+1, то будет снова добавляться материал с кодом 3. Так вот: после пака материалов нужно просто еще пробежать по таблице сметы, удалить все материалы с кодом 2 и там где материалы с кодом 3 - заменить его на 2. Все - работать будет великолепно.
А основание делать паки и переиндексации программно есть, причем очень веское! Если ты написал прогу для своей компании и она только у вас активно используется - то можно и ручками перепаковывать. А если ты ее сделал на заказ и она используется где-то далеко компанией, в кот и программеров-то нет? Кто там и что ручками будет через фокс делать? А перепаковывать и переиндексировать базу время от времени надо. И че делать-то? Они тебе по почте будут несколькогигабайтную базу слать? Не выход. А если есть сервисная функция такая - то даже распоследний юзер (секретарша шефа ) сможет нажать кнопочку "переиндексация", если у него будет в инструкции это написано.

ЗЫМ насчет примера - никто конечно же со сметами так не работает Если в ней был цемент, то он и должен остаться, а не на песок заменяться или удаляться вообще, так что не судите строго Это просто первый пример, кот пришел в голову.
...
Рейтинг: 0 / 0
Проблема помогите!
    #33158020
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2lo-pata
А, теперь понял устройство несколько больше. Нет, все равно не одобряю. Слишком много накладных расходов, таких, как ресурсов, затрачиваемых на перепаковку, например.
...
Рейтинг: 0 / 0
Проблема помогите!
    #33160394
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi lo-pata!

Это называется "... голова рукам покою не даёт" :) Т.е. дабы отстоять ВЕСЬМА спорное проектное решение (а не сделать нечто более нормальное и универсальное), приводится дикой код перекодирования :)
Опять-же ты лишь на ОДИН момент ответил - про PACK - про работу НЕ напрямую с таблицей (а скажем с банальным представлением, особенно если надо СРАЗУ и основную запись вводить и подчинёные - для справочника складов это неактуально, а вот для всяких там накладных и прочего - очень даже нужно) - не ответил...

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Проблема помогите!
    #33163541
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Igor Korolyov

А что там отвечать даже? Вообще не вижу проблемы - сделал себе представление, добавляй и удаляй что надо. Надо сохранить эти изменения в главной таблице и подчиненных? чем вопрос: никаких проблем нет. Делаешь аппенд в главную, в подчиненные - можно триггеры для таблиц прописать или в самом коде указать что и куда повставлять, где сложность? Удаление - то же самое. Может я и не прав, конечно, но приведи хоть пример, где могут вылезти партаки? Или воопрос сформулируй поконкретнее - отвечу более предметно.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема помогите!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]