powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / обновление данных курсора
20 сообщений из 20, страница 1 из 1
обновление данных курсора
    #38657657
kokosik10b
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, проект телефонный справочник. Данные формируются из таблиц справочник(фамилия,имя,отчество,добкод,номер,кодулицы,дом,квартира) и улицы(кодулицы,улица).Справочник-дочерняя,улицы-родительская.
Код кнопки поиск
Код: sql
1.
2.
3.
4.
family= UPPER(ALLTRIM(THISFORM.t1.Value))
SELECT D.фамилия, D.имя, D.отчество,D.добкод as дополнительный_код, D.номер, R.улицы as улица, D.дом, D.квартира;
FROM справочник D, улицы R WHERE (UPPER(D.фамилия)=family) AND D.кодулицы = R.кодулицы INTO CURSOR omg READWRITE
Form1.Grid1.RecordSource="omg"


Проблема в обновлении таблицы на форме после выполнения удаления.Удаляю текущую запись из таблицы справочник.
Код кнопки удаление
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
nomer=omg.номер 
SELECT справочник
DELETE FROM справочник WHERE nomer=номер
PACK
WITH ThisForm.Grid1
    .RecordSource = "omg"
    .Column1.ControlSource = "omg.Фамилия"
    .Column2.ControlSource = "omg.Имя"
    .Column3.ControlSource = "omg.Отчество"
    .Column4.ControlSource = "omg.дополнительный_код"
    .Column5.ControlSource = "omg.Номер"
    .Column6.ControlSource = "omg.Улица"
    .Column7.ControlSource = "omg.Дом"
    .Column8.ControlSource = "omg.Квартира"
ENDWITH
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657662
kokosik10b
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Временно решила проблему дублированием запроса в кнопке удаление.Может есть лучше вариант?Встретила совет о использовании CursorAdapter или Local View.Может кто-нибудь объяснить что это и с чем его едят?
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657664
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kokosik10b,

1. Уберите PACK из регулярной процедуры. Засуньте в отдельный пункт меню вроде "Сервисное обслуживание БД"
2. Имена полей на кириллице... жесть... жуть... небось - с 1С-а на фокс перескочили? Бросайте эту плохую привычку.
3. После установки пометки на удаление делайте REFRESH грида.

N. Сносить данные по "номер = номер" достаточно рисково. Уверены, что таким образом не покалечите другие записи (где указанный номер был введен тоже, но является правильным, например)?. Добавляйте уникальное Ид поле и ориентируйтесь только на него в подобных вещах.
N+1. Перед тем как начать писать код... все-таки... RTFM!!
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657666
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kokosik10b,

Не оскорбляйтесь, но ничего Вы не решили этим... просто иллюзию наличия заплатки на прорехе создали.

1. Приведите таблицу в человеческий вид. Минимум - добавьте уникальный идентификатор. Оптимально - уберите кириллицу из названий
2. Удаляйте опираясь только на уникальный ид. Все это "номер = номер" - от лукавого.
3. Если у вас структура наполнения грида будет всегда постоянной - не проще ли будет заполнить ее один раз на входе, а не указывать при каждом клике?
4. Вы удаляете из "справочник". С чего вы решили, что запись сама пропадет и из курсора? "Курсор" в фоксе - это в основном виртуальная таблица, сформированная как результат запроса. Как только она сформирована - она не зависима от "породивших" и изменения в таблице никак не изменят состав курсора, если его явно не обновить. Значит - удалять запись надо не только с таблицы, но и из курсора.
5. Как дополнительный "фокус" - перед удалением убирайте с экрана грид (VISIBLE), а потом - возвращайте
6. И да поможет Вам REFRESH
7. "Справочник-дочерняя,улицы-родительская."... нет желания все же в запросе использовать LEFT JOIN, а не ... то, что Вы написали?

N+2... и еще много чего... но елки-палки - будет правильней, если Вы все же пройдетесь хоть по диагонали по учебнику
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657684
kokosik10b
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поле номер и является уникальным. Оно в дальнейшей работе не фигурирует.
Обязательно удаление должно производиться отдельно?Мне хотелось бы удаление записи из курсора и из самой таблицы.В том и дело,что я пыталась удалить запись из таблицы справочник и обновить курсор
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657691
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kokosik10b,

Интересная у Вас расшифровка слова "уникальный" %)))
Разве я говорил про "одноразовый"?

"Уникальное" - это значит, что значение этого поля гарантированно не повторится ни в одной другой записи.


Не обязательно отдельно. Но - очень желательно.

DELETE ставит на запись отметку на удаление.
PACK - физически сносит все записи, где стоит эта отметка.
Заметьте - ВСЕ. Зачем 50 раз повторять одно и то же действие, если с одинаковым итогом оно сработает, если его выполнить 1 раз?
К тому же - подобное разделение функции на 2 части ("отметить" и "удалить") предназначено и для предоставление возможности передумать и "восстановить" (снять пометку на удаление)

И - тот же самый грид на форме - ну оооочень не любит использование PACK на источниках данных
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657696
kokosik10b
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SSn888,номер является первичным ключом."Уникальным"
Извините,если я очень туплю,но что в корне изменилось если я поменяла запрос на объединение
Код: sql
1.
2.
3.
family= UPPER(ALLTRIM(THISFORM.t1.Value))
SELECT D.familiya, D.imya, D.otch, D.dkod , D.nomer, R.street, D.dom, D.kvartira;
FROM sprav D LEFT JOIN  street R on (UPPER(D.familiya)=family) AND D.ksteet = R.kstreet INTO CURSOR omg READWRITE
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657700
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kokosik10bSSn888,номер является первичным ключом."Уникальным"
Извините,если я очень туплю,но что в корне изменилось если я поменяла запрос на объединение
Код: sql
1.
2.
3.
family= UPPER(ALLTRIM(THISFORM.t1.Value))
SELECT D.familiya, D.imya, D.otch, D.dkod , D.nomer, R.street, D.dom, D.kvartira;
FROM sprav D LEFT JOIN  street R on (UPPER(D.familiya)=family) AND D.ksteet = R.kstreet INTO CURSOR omg READWRITE





Ага... и ПК, и уникален... ну - эт значит - я не так понял в самом начале.


Что поменялось?
А просто - "привыкайте писать правильный код".
Сейчас-то может - подобное и "прошло безнаказанно", но может и выйти боком в виде дублей в результатах и прочих радостей.
Поменялось то, что FROM a, b WHERE - это аналог FULL JOIN, а не LEFT .... но поменялось-то не совсем верно %)
надо было. Обратите внимание - связка отдельно - она касается соединения таблиц, а условие отбора - отдельно.
Вы ведь связываете с таблицей улиц только коду улицы, не так ли?


Код: sql
1.
2.
3.
4.
5.
SELECT D.familiya, D.imya, D.otch, D.dkod , D.nomer, R.street, D.dom, D.kvartira;
FROM sprav D 
LEFT JOIN  street R on D.ksteet = R.kstreet 
WHERE  UPPER(D.familiya)=family
INTO CURSOR omg READWRITE



Скажите - а какой у вас порядок объема данных в таблицах?
Я чего-то сначала подумал про какие-то достаточно большие объемы, но сейчас, еще раз глянув на скриншот - решил, что вовсе и нет... потому что в зависимости от этого напрашиваются разные способы решения.
если объем данных не так уж и велик - зачем вообще курсоры да выборки? почему б не напрямую?
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657708
kokosik10b
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SSn888,подразумевается телефонный справочник города.Количество записей немало
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657710
kokosik10b
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SSn888,да через код улицы в справочнике ищу ,соответствующую коду улицу в таблице улиц.И заменяю код названием
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657715
kokosik10b
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Left Join- результат включает все записи из таблицы слева и записи, отвечающие условию объединения, из таблицы справа?
Но мне не нужны все значения таблицы справочник, одно поле я заменяю из таблицы улиц(код улицы заменяю на улицы)
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657716
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дело в том, что Вы можете подменять код названием и динамически-автоматически, без использования запросов

В самом начале, при указании источников данных для грида и его колонок (надеюсь - уже перенесли это из процедуры удаления в запуск формы?) добавьте в колонку улицы объект комбо

Код: sql
1.
2.
3.
ThisForm.Grid1.RecordSource = 'sprav'

ThisForm.Grid1.Column6.AddObject('combo1', 'combo box')



укажите, что управляющими данными в нем будут из таблицы1, а отображаться на экране - данные таблицы, на которую ссылаются

Код: sql
1.
2.
3.
4.
5.
6.
ThisForm.Grid1.Column6.combo1.RowSourceType = 6
ThisForm.Grid1.Column6.combo1.RowSource = 'street.street, kstreet'
ThisForm.Grid1.Column6.combo1.BoundColumn = 2
ThisForm.Grid1.Column6.combo1.ControlSource =  'sprav.kstreet'
ThisForm.Grid1.Column6.Sparse = .F.
ThisForm.Grid1.Column6.CurrentCotrol = 'combo1'




И - усе... нет Вам нужды исхищряться, прикручивая вспомогательную таблицу... работайте только с основной, а юзер будет видеть название улицы
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657718
kokosik10b
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SSn888,в удалении не дописана строчка
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ThisForm.Grid1.RecordSource = ""
nom=omg.nomer 
SELECT sprav
DELETE FROM sprav WHERE nom=nomer 
Pack
WITH ThisForm.Grid1
    .RecordSource = "omg"
    .Column1.ControlSource = "omg.фамилия"
    .Column2.ControlSource = "omg.имя"
    .Column3.ControlSource = "omg.отчество"
    .Column4.ControlSource = "omg.дополнительный_код"
    .Column5.ControlSource = "omg.номер"
    .Column6.ControlSource = "omg.улица"
    .Column7.ControlSource = "omg.дом"
    .Column8.ControlSource = "omg.квартира"
ENDWITH


сброс ControlSource, а после упаковки восстанавливается. Иначе с PACK работа не возможна
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657719
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kokosik10b,

А фулл джоин - выдает ВСЕ записи и левой, и правой таблиц...
Если есть соответствие меж ними - строит ровно столько, сколько и соответствий...
Плюс - все записи левой таблицы, для которых в правой аналог не найден...
Плюс - все правой, у которой аналог в левой не найден...
%)
Оно Вам надо?

авторLeft Join- результат включает все записи из таблицы слева и записи, отвечающие условию объединения, из таблицы справа?
Но мне не нужны все значения таблицы справочник, одно поле я заменяю из таблицы улиц(код улицы заменяю на улицы)
Почему Вы решили, что "все значения таблицы справочник"?
У вас есть условие связки меж таблицами.
В данном случае - код улицы.
Берет каждую запись левой таблицы, из нее значение по связке и ищет в правой таблице запись, отвечающую такому же условию.
если находит - прикручивает. Если не находит - прикручивает нуль. Если находит 2 значения (если в улицах -две с одинаковым кодом - чего, полагаю, все же нет %) ) -дублирует в результате выборки запись левой таблицы, прикручивая к ней обе найденных в правой. по очереди.
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657721
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kokosik10b,

Да оставьте вы этот ПАК в покое, вот ведь прицепились :)
Ну, нет желания его отдельно выносить в "сервис"- так просто делайте по выходу из формы.
Зачем его каждый раз-то гонять при вызове метода кнопки? чтоб себе трудности создать?

И заполнение свойств грида оттуда уберите на запуск формы.

А на самой кнопке удаления оставьте только

Код: sql
1.
2.
3.
4.
ThisForm.Grid1.Grid1.Visivle = .F.
DELETE .................
ThisForm.Grid1.Grid1.Visivle = .T.
ThisForm.Grid1.Grid1.Refresh()



ну, и не забудьте, что если Вы удалили запись, а в перед этим были на ней - то стОит явно перейти на запись после удаленной или предшествующую ей
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657723
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kokosik10b,

Подразумевается, что подобные данные все-таки держат в чем-нить типа SQL и подобные отборки идут все же на стороне сервера, а не на клиенте.
И не с полями на русском языке... И... впрочем - ладно.

Судя по всему - у Вас это все реализовано сооовсем не самым лучшим способом с этой точки зрения. То есть - "начинает реализовываться"

Сиречь - или тут пахнет художественным извратом, или студенческой курсовой, или очень-очень новичком.
Впрочем - возможны и сочетания.

Я, упаси боже, не стараюсь высказать что-то вроде "фе - опять студенты поналезли".


Но... не могу понять, как относиться-то..
Если студент и/или новичек - то, как Вы пытаетесь вникнуть в проблему - вызывает положительные чуства (если откинуть Ваше нежелание все-таки почитать доки)
Если же иное.... гм... ну - как минимум - странен вообще факт возникновения подобной задачи в подобной формулировке и возникает вопрос "эээ.... вы на зарплате?... а кто вас нанял?"
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657765
Фотография Vladimir M Sklyar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSn888,подразумевается телефонный справочник города.Количество записей
немало


не в тему, но про телефоны :)

У нас в городе номера телефнов очень часто меняли из-за замены в телекоме
старых АТС на новые - в БД города телефонного справочника появилось понятие
как ЛИЦЕВОЙ СЧЕТ (он уникальный и единый, а телефонов у него может быть
много :) )

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657772
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir M SklyarSSn888,подразумевается телефонный справочник города.Количество записей
немало


не в тему, но про телефоны :)

У нас в городе номера телефнов очень часто меняли из-за замены в телекоме
старых АТС на новые - в БД города телефонного справочника появилось понятие
как ЛИЦЕВОЙ СЧЕТ (он уникальный и единый, а телефонов у него может быть
много :) )



1. Не могу себе представить достаточно большой город, в котором в местных телесетях уже давно нет какого-то подобного софта и базы. Судя по сообщению ТС - БД и логика создается именно с нуля. Кому может понадобиться создавать подобное с нуля, если "см. предложение 1"?

2. Повторюсь - не из злобных нелюбителей студентов (хотя реплики вида "сделайте все за меня" раздражают) и ничего плохого в выводе из п.1 нет. Даже более - ТС действительно пытается и старается, что - достойно...

3. Дык... это ж вроде как вполне логично :) Что-то же должно быть в записи уникальное и неизменное ;)
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657953
Pulsar_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSn888
1. Уберите PACK из регулярной процедуры. Засуньте в отдельный пункт меню вроде "Сервисное обслуживание БД"
...


PACK нужно убрать не только из регулярной процедуры, а из онлайн-режима вообще, потому как если этого не сделать, с данной программой (базой) сможет работать всего один пользователь, монопольный режим, иным словом.
...
Рейтинг: 0 / 0
обновление данных курсора
    #38657955
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pulsar_p,

Вы слишком глубоко нырнули для ТС.
Всему свое время, пусть для начала хоть с кнопки уберет :)

Обратите внимание - используется явно файловая версия базы, DBC. Вовсе не SQL.
Структура базы явно не планировалась практически никак, доделывается на лету, параллельно коду клиента.
Либо это пока просто наработка и задумываться о многопользовательском варианте очень рано, дай бог хоть макет монопольного слабать.
Либо это что-то типа курсовой и тогда заморачаваться всякими многопользователями, распределением прав и так далее - излишне
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / обновление данных курсора
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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