powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Ошибка программы
25 сообщений из 25, страница 1 из 1
Ошибка программы
    #34138773
mr. Eof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Господа профессионалы, помогите мне пожалуйста!

Ситуация в следующем:
Есть одна форма и две таблицы.
В форме - в Text1 и text2 пользователь вводит значения и нажимает кнопку подтверждения.
Программа ищет в таблице access_table запись с такими значениями. Если такая найдена, то записать ее id в log_table и переходит к другой форме, иначе - выходит.

Структура таблиц:
access_table
|--------------------------------|
| id | Login | Password |
|--------------------------------|

log_table
|----------------------------|
| id | User_id | Time |
|----------------------------|

Я делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
CLOSE TABLES all

id =  0 

USE "Tables\access_table.dbf" ALIAS access_table
SELECT access_table

num = RECCOUNT()
FOR i =  1  TO num STEP  1 
	GOTO i
	IF ((access_table.Login = thisform.text1.Value ) AND (access_table.Password = thisform.text2.Value)) THEN
		id = access_table.id   
		EXIT 
	ENDIF
ENDFOR

CLOSE TABLES all

IF id <>  0  THEN
	USE "Tables\log_table.dbf" ALIAS log_table
	SELECT log_table

	INSERT INTO log_table (user_id, time) VALUES (id, date())

	thisForm.Release
	DO FORM 'Forms\MainMenu.scx'
ELSE
	thisForm.Release
	CLOSE ALL
ENDIF

Но! Результат всегда один. Как при правильно введенных значениях так и при не правильных, программа - завершается...

Помогите пожалуйста.
...
Рейтинг: 0 / 0
Ошибка программы
    #34138835
Guest1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно что-нить типа такого поробывать:

USE log_table IN 0
USE access_table IN 0
SELECT access_table

LOCATE FOR (UPPER(access_table.Login) = UPPER(thisform.text1.Value) ) AND;
(UPPER(access_table.Password) = UPPER (thisform.text2.Value) ))
IF FOUND()
INSERT INTO log_table (user_id, time) VALUES (access_table.id , date())

thisForm.Release
DO FORM 'Forms\MainMenu.scx'
ELSE
thisForm.Release
ENDIF
...
Рейтинг: 0 / 0
Ошибка программы
    #34138842
MAJIbIIII
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет вся твоя ошибка заключается в одной строке. Смотри как надо (и у тебя все получится):

IF ((access_table.Login = alltrim(thisform.text1.Value) ) AND ;
(access_table.Password = alltrim(thisform.text2.Value))) THEN
id = access_table.id
...
Рейтинг: 0 / 0
Ошибка программы
    #34138882
MAJIbIIII
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ссори хотел как лучше, получилось как всегда. Вот так будет лучше:
Да и вообще правильно говорит Guest1000 сделай следующим образом:


CLOSE TABLES all

id = 0

USE Tables\access_table IN 0
USE Tables\log_table.dbf IN 0

SELECT('access_table')

* просто чтоб не возникло путаницы в дальнейшем
num = RECCOUNT('access_table')

* STEP 1 вообще-то идет по умолчанию (смысла нет эту команду оставлять)
FOR i = 1 TO num
GOTO i
IF ((access_table.Login=ALLTRIM(thisform.text1.Value)) AND ;
(access_table.Password=ALLTRIM(thisform.text2.Value))) THEN ;
id = access_table.id
EXIT
ENDIF
ENDFOR

SELECT('log_table')
IF id <> 0 THEN

INSERT INTO log_table (user_id, time) VALUES (id, date())

thisForm.Release
DO FORM 'Forms\MainMenu.scx'
ELSE
thisForm.Release
CLOSE ALL
ENDIF
...
Рейтинг: 0 / 0
Ошибка программы
    #34138888
mr. Eof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за советы!
Реализовал как вы говорили.

Последний и предпоследний варианты - работают, но!

В таблицу они пишут не id из первой таблицы, а число 1! По любому, тоесть, должен например записать 1001, а пишет 1. Должен 1003 а пишет 1.

Господа, что это как вы думаете?
...
Рейтинг: 0 / 0
Ошибка программы
    #34138890
MAJIbIIII
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пришли исходники (2 таблицы, и 2 формы) скажу точно!
majibiiii@yandex.ru
...
Рейтинг: 0 / 0
Ошибка программы
    #34138891
mr. Eof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще! он - не проверяет верность!
тоесть он не ищет! я ввел значение, которого не существует в таблице 1 (там где ищем) а в базу всеравно зашел!!!
...
Рейтинг: 0 / 0
Ошибка программы
    #34138896
mr. Eof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ок. спасибо. пришлю через 5 минут
...
Рейтинг: 0 / 0
Ошибка программы
    #34138904
MAJIbIIII
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr. Eofок. спасибо. пришлю через 5 минут
Просьба сообщение отослать еще раз (файл оказался испорченным) без инструкций...
...
Рейтинг: 0 / 0
Ошибка программы
    #34138905
mr. Eof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот файл: http://www.webfile.ru/1198321
...
Рейтинг: 0 / 0
Ошибка программы
    #34138919
MAJIbIIII
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CLOSE TABLES all

id_ =  0 

USE 'Tables\access_table' IN  0 
USE 'Tables\log_table.dbf' IN  0 

SELECT('access_table')

num = RECCOUNT('access_table')

FOR i =  1  TO num
	GOTO i
	IF ((access_table.Login+" "=ALLTRIM(thisform.text1.Value)+" ") AND (access_table.Password+" "=ALLTRIM(thisform.text2.Value)+" ")) THEN
		id_ = access_table.id 
      EXIT 
	ENDIF
ENDFOR

SELECT('log_table')
IF id_ <>  0  THEN
	INSERT INTO log_table (user_id, time) VALUES (id_, date())
	thisForm.Release
	DO FORM 'Forms\MainMenu.scx'
ELSE
	thisForm.Release
	CLOSE ALL
ENDIF
Кажется так все работает (ловкость рук и никакого мошеничества). Если что -то не поймешь или еще что-то не получится пиши e-mail ты знаешь.
...
Рейтинг: 0 / 0
Ошибка программы
    #34138921
mr. Eof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо!

Все - работает!

Честно сказать, круто, хотя зачем нужен пробел " " - я так и не понял..

Но всеравно - спасибо!
...
Рейтинг: 0 / 0
Ошибка программы
    #34138922
MAJIbIIII
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отвечаю пробел нужен для того чтобы fox автоматически (при пустом text2 и правильном логине) не подставлял правильное значение в адрес. Короче пользуйся на здоровье!
...
Рейтинг: 0 / 0
Ошибка программы
    #34138926
ORAselect
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PUBLIC pass
* Инициализация переменной перед тем, как нажать кнопку, а затем

pass = allt(pass)

select count(*) flag ,p.* from TablePassword p where p.pasword = pass into cursor MyCursor

sele MyCur
if flag #0
insert into LogTable values(MyCur->id,IdUser,sysdate)
messagebox('Вас приветствует программа....!')
else
messagebox('Ошибка идентификации!')
endif

rele pass
...
Рейтинг: 0 / 0
Ошибка программы
    #34138927
ORAselect
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправь имя курсора везде MyCursor. Пользуйся запросами везде, где можно. А можно везде. Не втыкай явные циклы, не используй replace... и не придется пробелы считать, думать как и что сравнивать. Изучи команды SQL - поможет наперед!!!
...
Рейтинг: 0 / 0
Ошибка программы
    #34138958
mr. Eof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ORAselectПоправь имя курсора везде MyCursor. Пользуйся запросами везде, где можно. А можно везде. Не втыкай явные циклы, не используй replace... и не придется пробелы считать, думать как и что сравнивать. Изучи команды SQL - поможет наперед!!!

Большое спасибо!
...
Рейтинг: 0 / 0
Ошибка программы
    #34139178
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORAselectПоправь имя курсора везде MyCursor. Пользуйся запросами везде, где можно. А можно везде. Не втыкай явные циклы, не используй replace... и не придется пробелы считать, думать как и что сравнивать. Изучи команды SQL - поможет наперед!!!
Для поиска одной записи использовать Select-SQL? Можно, конечно, но это называется "из пушки по воробьям". "Использовать везде, где можно" - слишком категорично. Получишь массу проблем и тормозов. Как ни странно, но Select-SQL далеко не всегда самый быстрый способ поиска данных.

Вообще-то, самый первый ответ от Guest1000 - самый правильный. Вместо перебора следует использовать команду LOCATE

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CLOSE TABLES all

USE "Tables\access_table.dbf" ALIAS access_table
SELECT access_table

* Для оптимизации команды LOCATE надо отключить главный индекс
SET ORDER TO  0 

* Число  10  в функции PADR() - условно. 
* Надо поставить то значение, которое равно размерности поля, с которым идет сравнение
* Разумеется, если поля Login и Password - это поля типа Character, а не VarChar
LOCATE FOR access_table.Login = PADR(thisform.text1.Value, 10 ) AND ;
			access_table.Password = PADR(thisform.text2.Value, 10 )

IF FOUND("access_table") = .T.
	USE "Tables\log_table.dbf" ALIAS log_table
	SELECT log_table

	INSERT INTO log_table (user_id, time) VALUES (access_table.id, date())
	thisForm.Release
	DO FORM 'Forms\MainMenu.scx'
ELSE
	thisForm.Release
	CLOSE ALL
ENDIF
...
Рейтинг: 0 / 0
Ошибка программы
    #34139190
ORAselect
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еше раз об SQL. Еще раз - применяйте везде. Меньше ошибок, Код короче, работает быстрее в разы, отладка минимальна - негде косячить. А "ПУШКА" - это не пушка, а механизм, причем гораздо менее затратный во всех отношениях.

Надо уметь им пользоватться, в т.ч. индексами. По индексированной таблице select работает как seek. Короче, читайте хорошие книги, не живите в прошлом веке - паровоз уже уехал далеко.
...
Рейтинг: 0 / 0
Ошибка программы
    #34139220
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORAselectНадо уметь им пользоватться, в т.ч. индексами.
Золотые слова! Я серьезно.

Только почему Вы применяете их выборочно? Для Select-SQL: "учитесь пользоваться", а для всех остальных команд поиска: "прошлый век", "поезд ушел"?

Если рассматривать команду Select-SQL, то, в общем случае:

1) Сложнее для понимания. Как следствие, кличество ошибок больше . Сложнее в отладке. Накосячить тоже есть где. Не в синтаксисе, а именно в логике.

Например, Вы уже накосячили даже в такой примитивной задаче. Ошибочная логика. Вас подвела именно кажущаяся простота. Как собственно задачи, так и конструкции Select-SQL.

Точнее, не то, чтобы "накосячили", а сделали ряд допущений, при которых такая логика будет работать. Но не спросили автора топика, а действительно ли у него заданы эта граничные условия? В данном случае:

-) SET ANSI (возможен ли поиск по первым символам?)
-) Может ли быть для разных Login один и тот же Password (где проверка Login?)
-) Уже не по Select-SQL: использовать PUBLIC для локальных задач - получить большие проблемы

2) Есть ряд задач, когда Select-SQL работает значительно медленнее навигационных команд

3) Если речь идет о таблицах, объем записей которых невелик (не думаю, что список пользователй так уж огромен), то разница в скорости команд Select-SQL и навигационных команд не ощутима. Как для программы, так и для пользователя


Для справки :

ВСЕ команды FoxPro имеющие опцию FOR также используют Rushmore-оптимизацию. Для полного ее использования рекомендуется перед такими командами отключать главнй индекс (SET ORDER TO 0). В этом случае скорость работы таких команд сопоставима со скоростью SEEK.
...
Рейтинг: 0 / 0
Ошибка программы
    #34139580
ORAselect
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Володя!

В итоге есть задача, а она на самом деле достаточно тривиальна и проста. Делать туманные представления о возможных проблемах там, где их нет не вижу смысла и опыт (более 20 лет) показал, что именно SQL наиболее полно соответствует именно сложным программам с внушительной логикой.
А переход на работу в СУБД ORACLE и совсем привел к мысли, что там, где есть выбор между SQL и чем угодно еще нужно выбирать SQL.
Собственно, это показала мировая практика и тут Ваше мнение вряд ли что изменит.

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

В третьих. И Вам советую применять SQL везде, где можно. Попрактикуете и наверняка согласитесь. Я тоже лет 10 назад подписался бы под вашим ответом.

С наилучшими, искренне Ваш...
...
Рейтинг: 0 / 0
Ошибка программы
    #34139592
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORAselectВ третьих. И Вам советую применять SQL везде, где можно. Попрактикуете и наверняка согласитесь....
Это очень спорный совет...

Не вдаваясь в подробности хотелось бы зметить для чистоты ответа (поддержав замечание Владимира), что команды SEEK и предикт FOR работают во многих случаях намного быстрее CRUD комманд, но это относится исключительно к FoxPro, так как есть выбор...
...
Рейтинг: 0 / 0
Ошибка программы
    #34139627
ORAselect
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Ch ORAselectВ третьих. И Вам советую применять SQL везде, где можно. Попрактикуете и наверняка согласитесь....
Это очень спорный совет...

Не вдаваясь в подробности хотелось бы зметить для чистоты ответа (поддержав замечание Владимира), что команды SEEK и предикт FOR работают во многих случаях намного быстрее CRUD комманд, но это относится исключительно к FoxPro, так как есть выбор...

Все относительно - разумеется, но есть и вопрос, на который давался ответ. И речь идет о подходе, а не о частностях и подход я считаю верным именно тот, который советую. Быстрее и "с тормозами" очень сильно зависит от частностей. Но и они не отменяют преимуществ SQL. Это вовсе не означает, что надо инициализировать локальную переменную всесто '01' конструкцией с селектом. Однако в теле программы гораздо понятнее именно селекты...

С уважением...
...
Рейтинг: 0 / 0
Ошибка программы
    #34145094
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORAselectОднако в теле программы гораздо понятнее именно селекты...
Применительно к Фоксу...
- Селекты могут быть и гораздо непонятнее, особенно при использовании evaluate() и макроподстановки...
что сплошь и рядом случается при наращивании пользовательского интерфейса запросов.
- Селекты себя оправдывают в логике вычислений и отбора данных, "скрытых" от пользователя.
- Селекты себя мало оправдывают в интерактивном режиме, поскольку проще связать
базу-вью-грид и делать locate по эвенту (извращаюсь я для примера :), чем отбор 1 записи
из базы с 1-5-20 млн. по условию на 5 полей

2ВладимирМ да это я так, давно уже в ветку не заглядывал...
...
Рейтинг: 0 / 0
Ошибка программы
    #34145129
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хороший язык фокс (((
только спецов на нем все меньше (((
...
Рейтинг: 0 / 0
Ошибка программы
    #34145272
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORAselect
В итоге есть задача, а она на самом деле достаточно тривиальна и проста. Делать туманные представления о возможных проблемах там, где их нет не вижу смысла и опыт (более 20 лет) показал, что именно SQL наиболее полно соответствует именно сложным программам с внушительной логикой.
В данном случае использование Select-SQL усложняет и затуманивает решение задачи. Зачем мне подсчитывать количество , если надо найти одну единственную запись? Любую.

ORAselectА переход на работу в СУБД ORACLE и совсем привел к мысли, что там, где есть выбор между SQL и чем угодно еще нужно выбирать SQL.
Не совсем так. В данном случае это привело к лености мысли.

У Вас есть две среды разработки: Хранилище данных (в данном случае ORACLE) и FoxPro.

Каждая среда предполагает определенную идеологию работы. Это означает, что надо постоянно "переключаться" с одной идеологии на другую. Это сложно и трудно. А поскольку FoxPro позволяет использовать Select-SQL, то для простоты Вы сделали вывод: надо везде использовать одинаковые команды. Это проще . Для Вас.

Но это вовсе не означает, что это проще на самом деле.

ORAselectСобственно, это показала мировая практика и тут Ваше мнение вряд ли что изменит.
После такого заявления, обычно предлагается привести "явки и пароли". Знаете ли, после советского воспитания, я слабо верю лозунгам и призывам типа: Я, как и весь трудовой народ... Говори за себя, а "весь трудовой народ" еще неизвестно как думает Как мне кажется, это вовсе не "мировая практика", а Ваше личное мнение.

ORAselectВо-вторых. Явно пишет новичек и именно ему, а не Вам я дал вполне ответственный совет.
Вот именно! Если Вы даете какой-то совет, то аргументируйте его! ПОЧЕМУ надо делать именно так, а не иначе? А лозунги, они лозунги и есть. Рассчитаны не на знание, а на эмоции.

ORAselectВ третьих. И Вам советую применять SQL везде, где можно. Попрактикуете и наверняка согласитесь. Я тоже лет 10 назад подписался бы под вашим ответом.
Применять инструмент надо по назначению . Расхожий штамп: микроскопом гвозди забивать. Ведь можно же! Почему не забивают?

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


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