Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

lamed
Статус: Практикант
Рейтинг: 2108
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 1751
∙ повысить рейтинг »
Jimhucksly
Статус: 5-й класс
Рейтинг: 629
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Delphi и Lazarus

Номер выпуска:1491
Дата выхода:06.02.2010, 22:00
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:552 / 226
Вопросов / ответов:1 / 1

Вопрос № 176437: Здравствуйте уважаемые эксперты! Имеется программа: «Ввод остатков по складу готовой продукции» ССЫЛКА


Вопрос № 176437:

Здравствуйте уважаемые эксперты!
Имеется программа: «Ввод остатков по складу готовой продукции» ССЫЛКА



Таблица KACZCH.dbf:
«Черт N – Наименование» - NCHTO;
«Ед.изм.» - EI
«Цена» - OCN.
Поля «Кол-во» и «№ кладовщика» пустые, в них вводится информация
«Дата остатков» - вводится с клавиатуры
«№ кладовщика» - значение 1/3 (Работают 3 человека, и каждый ведёт свои позиции)
«Поиск по наименованию» - по введенному в поле поиска части записи из таблицы KACZCH.dbf поля NCHTO, выводится строка(и) на экранной форме, соответствующие введенным данным для поиска.
По кнопке «Сохранить» формируется файл OSGP.dbf, где:
DOST - Дата остатков
CHTO - CHTO ( -//-)
NCHTO - NCHTO ( -//-)
OCN – OCN ( -//-)
VES – VES ( -//-)
EI – EI ( -//-)
NKL - № кладовщика (экранная фор ма)
NSKL – присвоено 72 (по всем записям)
OST – Кол-во (экранная форма)
CI – CI ( -//-)
KZK – KZK ( -//-)

Задание:
1) на экранной форме создать перед «Черт N – Наименование» ещё одно поле ввода «Номер карточки складского учёта» (№ карт.) состоящее из 4 чисел (например «0001»), которое также будет сохраняться в таблицу OSGP.dbf, в первое поле под названием NKART.
2) Создать кнопку, по нажатию на которую осуществляется переход на новую форму: «Остатки по складу готовой продукции», где отображаются все поля и записи таблицы OSGP.dbf (без возможности редактирования)
3) Создать кнопку, по нажатию на которую осуществляется переход на новую форму: «Оглавление карточки складского учёта склада ГП»,

в которой при выборе Кладовщика, из таблицы OSGP.dbf выводились бы записи, по полям NKART – № карт. и NCHTO – Черт N – Наименование, соответствую щие выбранному кладовщику. По ним же обеспечить возможность поиска.

Отправлен: 01.02.2010, 21:46
Вопрос задал: Судейкин Андрей Владимирович, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Евгений/Genia007/, Бакалавр :
Здравствуйте, Судейкин Андрей Владимирович.
Поиск по номерам карт и наименований происходит после нажатия клавиши enter, когда фокус установлен в поле ввода.
Это изменённый модуль исходной программы
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, Grids, DB, DBTables;

type
TForm1 = class(TForm)
Table1: TTable;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Button1: TButton;
MaskEdit1: TMaskEdit;
Query1: TQuery;
StringGrid1: TStringGrid;
ComboBox1: TComboBox;< br> Button2: TButton;
Label8: TLabel;
MaskEdit2: TMaskEdit;
Button3: TButton;
DataSource1: TDataSource;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox1Exit(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure MaskEdit2Exit(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
function CreateTable(TabNam e, TabStruct, TabIDX: string): boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;
FileNames: String;

implementation

uses Unit2, Unit3;

{$R *.dfm}

const
CreateTab = 'CREATE TABLE ';
IDXTab = 'PRIMARY KEY ';
MyTabStruct =
'NKART CHARACTER(4), ' +
'DOST DATE, ' +
'CHTO CHARACTER(18), ' +
'NCHTO CHARACTER(50), ' +
'OCN DECIMAL(12,2), ' +
'VES DECIMAL(10,3), ' +
'NKL CHARACTER(1), ' +
'NSKL CHARACTER(2), ' +
'EI CHARACTER(2), ' +
'CI CHARACTER(2), ' +
'OST DECIMAL(5), ' +
'KZK CHARACTER(6) ';

function TForm1.CreateTable(TabName, TabStruct, TabIDX: string): boolean; // Создаём новую таблицу
begin
result := true;
with Query1 do // Для query делаем
try
try
S QL.Clear; // Отчистили запрос
SQL.Add(CreateTab + TabName + '(' + TabStruct + TabIDX + ')'); // Добавили новый запрос
Prepare; // Оптимизация выполнения запроса
ExecSQL; // Выполняем запрос
except
// Обработка ошибок открытия таблицы
Exception.Create('Ошибка открытия таблицы'); // Генерация исключения
result := false;
end;
finally
Close; // Закрыть запрос
end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
{Перебросим выбранное в значение из ComboBox в grid}
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:= ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible:= False; // Спрятали комбобокс
StringGrid1.SetFocus; // Фокус на сетку
end;

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
{Перебросим выбранное в значение из ComboBox в grid}
StringGrid1.Cells[StringGrid1.Col, S tringGrid1.Row]:= ComboBox1.Items[ComboBox1.ItemIndex];
ComboBox1.Visible:= False; // Спрятали комбобокс
StringGrid1.SetFocus; // Фокус на сетку
end;

procedure TForm1.FormCreate(Sender: TObject);
var
row: integer;
begin
MaskEdit1.Text:= (DateToStr(Now)); // Присвоили полю ввода текущую дату
ComboBox1.Visible:= False; // Спрятать combobox
MaskEdit2.Visible:= false; // Спрятать maskedit
{Высоту combobox'а не изменишь, так что вместо combobox'а
будем изменять высоту строки grid'а !}
StringGrid1.DefaultRowHeight:= ComboBox1.Height;

{Table1.TableName:= ExtractFilePath(ParamStr(0))+'KACZCH.DBF'; }// Добавление имя базы
FileNames:= #39 + ExtractFilePath(ParamStr(0)) + 'KACZCH.DBF' + #39; // Получили строку с именем файла исходной таблицы
Query1.Close; // Закрыли запрос
Query1.SQL.Clear; // Отчистили запрос
Query1.SQL.Add('Select * from ' + FileNames); // Добавили новый запрос
Query1.Open; // Открыли запрос
Query1.first; // Перешли на первую строку запроса
/ / Выставляем нужную ширину колонок сетки
StringGrid1.colWidths[0]:= 60;
StringGrid1.colWidths[1]:= StringGrid1.Width - 395;
StringGrid1.colWidths[2]:= 60;
StringGrid1.colWidths[3]:= 64;
StringGrid1.colWidths[4]:= 64;
StringGrid1.colWidths[5]:= 119;
//
row:= 0;
StringGrid1.rowcount:= Query1.recordCount; // Уравняли количество строк в сетке с количеством записей в запросе
while not Query1.eof do // Пока не достигнут конец запроса делаем
begin
StringGrid1.cells[1,row]:= Query1.FieldValues['NCHTO']; // Добавляем данные в сетку
StringGrid1.cells[2,row]:= {Query1.FieldValues['EI']}'шт';
StringGrid1.cells[3,row]:= Query1.FieldValues['OCN'];
inc(row); // Увеличили на 1
Query1.next; // Переход на следующую запись
end;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
var
row: integer;
begin
if key = #13 then // Делаем поиск по нажатию enter
begin
// выполнить поиск
Query1.Close; // Закрыли запрос // |
Query1.SQL.Clear; // ' LIKE "%'+Edit2.Text+'%"' - ищет фрагмент текста
Query1.SQL.Add('Select * from ' + FileNames + ' where NCHTO LIKE "%'+Edit2.Text+'%"');
Query1.Open; // Окрыли запрос
if Query1.RecordCount <> 0 then // Если количество записей не равно 0 вставляем данные в сетку
begin
row:= 0;
StringGrid1.rowcount:= Query1.recordCount;
while not Query1.eof do
begin
StringGrid1.cells[0,row]:= '';
StringGrid1.cells[1,row]:= Query1.FieldValues['NCHTO'];
StringGrid1.cells[2,row]:= 'шт';
StringGrid1.cells[3,row]:= Query1.FieldValues['OCN'];
StringGrid1.cells[4,row]:= '';
StringGrid1.cells[5,row]:= '';
inc(row);
Query1.next;
end;
end
else // Иначе делаем запрос с текстом из заглавных букв
begin
Query1.Close; // |
Query1.SQL.Clear; // ' LIKE "%'+Edit2.Text+'%"' - ищет фрагмент текста
Query1.SQL.Add('Select * from ' + FileNames + ' where NCHTO LIKE "%'+AnsiUpperCase(Edit2.Text)+'%"');
Query1.Open;
if Query1.RecordCount <> 0 then // Если количество записей не равно 0 вставляем данные в сетку
begin
row:= 0;
StringGrid1.rowcount:= Query1.recordCount;
while not Query1.eof do
begin
StringGrid1.cells[0,row]:= '';
StringGrid1.cells[1,row]:= Query1.FieldValues['NCHTO'];
StringGrid1.cells[2,row]:= 'шт&# 39;;
StringGrid1.cells[3,row]:= Query1.FieldValues['OCN'];
StringGrid1.cells[4,row]:= '';
StringGrid1.cells[5,row]:= '';
inc(row);
Query1.next;
end;
end
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
s: string;
begin
if not FileExists(ExtractFilePath(ParamStr(0))+'OSGP.DBF') then // Если таблицы не существует
CreateTable('"OSGP.DBF"', MyTabStruct, ''); // Создаём её
Table1.TableName:= ExtractFilePath(ParamStr(0))+'OSGP.DBF'; // Добавление имя базы
Table1.Active:= true; // Открыли таблицу

for i:= 0 to StringGrid1.RowCount - 1 do // Проходим все строки сетки
if (StringGrid1.Cells[4, i] <> '') or (StringGrid1.Cells[5, i] <> '') then // Если ввели число в ячейку
begin
s:= #39 + StringGrid1.Cells[1, i] + #39; // Получаем строку для запроса обрамлённую апострофами
Query1.Close; // Закрыли запрос
Query1.SQL.Clear; // Отчистили запрос
Query1.SQL.Add('Select * from ' + FileNames + ' where NCHTO = '+s+''); // Добавили запрос
Query1.Open; // Открыли запрос
if Table1.Locate('NCHTO', StringGrid1.Cells[1, i], [loPartialKey]) then // Нашли в таблице нужную запись
begin // Такие данные уже есть
if ((Table1.FieldValues['DOST'] = MaskEdit1.Text) and (Table1.FieldValues['NKL'] = StringGrid1.Cells[5, i]) and (Table1.FieldValues['OST'] = StringGrid1.Cells[4, i])) then
ShowMessage('Введенные данные для записи ' + StringGrid1.Cells[1, i] + ' имеются в базе OSGP.dbf')
else
begin // Меняем данные в записи
Table1.Edit; // Ставим запись на редлактирование
Table1.FieldValues['NKART']:= StringGrid1.Cells[0, i];
Table1.FieldValues['DOST']:= MaskEdit1.Text; // Записываем новые данные
Table1.FieldValues['CHTO']:= Query1.FieldValues['CHTO'];
Table1.FieldValues['NCHTO']:= Query1.FieldValues['NCHTO'];
Table1.FieldValues['OCN']:= Query1.FieldValues['OCN'];
Table1.FieldValues['VES']:= Query1.FieldValues['VES'];
Table1.FieldValues['EI']:= Query1.FieldValues['EI'];
Table1.FieldValues['NKL']:= StringGrid1.Cells[5, i];
Table1.FieldValues['NSKL']:= '72';
Table1.FieldValues['OST']:= StringGrid1.Cells[4, i];
Table1.Fi eldValues['CI']:= Query1.FieldValues['CI'];
Table1.FieldValues['KZK']:= Query1.FieldValues['KZK'];
Table1.Post; // Сохранили изменения
end;
end
else // Нужную запись не нашли
begin
Table1.Insert; // Вставили новую запись в таблицу
Table1.FieldValues['NKART']:= StringGrid1.Cells[0, i];
Table1.FieldValues['DOST']:= MaskEdit1.Text; // Записываем новые данные
Table1.FieldValues['CHTO']:= Query1.FieldValues['CHTO'];
Table1.FieldValues['NCHTO']:= Query1.FieldValues['NCHTO'];
Table1.FieldValues['OCN']:= Query1.FieldValues['OCN'];
Table1.FieldValues['VES']:= Query1.FieldValues['VES'];
Table1.FieldValues['EI']:= Query1.FieldValues['EI'];
Table1.FieldValues['NKL']:= StringGrid1.Cells[5, i];
Table1.FieldValues['NSKL']:= '72';< br> Table1.FieldValues['OST']:= StringGrid1.Cells[4, i];
Table1.FieldValues['CI']:= Query1.FieldValues['CI'];
Table1.FieldValues['KZK']:= Query1.FieldValues['KZK'];
Table1.Post; // Сохранили таблицу
end;
//
end;
Table1.Active:= false; // Закрыли таблицу
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
R: TRect;
begin
if (ACol = 0) or (ACol = 4) or (ACol = 5) then // Редактируем только 3 и 4 ячейки
StringGrid1.Options := StringGrid1.Options + [goEditing] // Разрешаем редактировать таблицу
else
StringGrid1.Options := StringGrid1.Options - [goEditing]; // Запрещаем редактировать таблицу
if ACol = 5 then
begin
{Ширина и положение ComboBox должно соответствовать ячейке StringGrid}
R:= StringGrid1.CellR ect(ACol, ARow);
R.Left:= R.Left + StringGrid1.Left;
R.Right:= R.Right + StringGrid1.Left;
R.Top:= R.Top + StringGrid1.Top;
R.Bottom:= R.Bottom + StringGrid1.Top;
ComboBox1.Left:= R.Left + 1;
ComboBox1.Top:= R.Top + 1;
ComboBox1.Width:= (R.Right + 1) - R.Left;
ComboBox1.Height:= (R.Bottom + 1) - R.Top; {Покажем combobox}
ComboBox1.Text:= '';
ComboBox1.Visible:= True;
ComboBox1.SetFocus;
end;
if ACol = 0 then
begin
{Ширина и положение MaskEdit должно соответствовать ячейке StringGrid}
R:= StringGrid1.CellRect(ACol, ARow);
R.Left:= R.Left + StringGrid1.Left;
R.Right:= R.Right + StringGrid1.Left;
R.Top:= R.Top + StringGrid1.Top;
R.Bottom:= R.Bottom + StringGrid1.Top;
MaskEdit2.Left:= R.Left + 1;
MaskEdit2.Top:= R.Top + 1;
MaskEdit2.Width:= (R.Right + 1) - R.Left;
Ma skEdit2.Height:= (R.Bottom + 1) - R.Top; {Покажем MaskEdit}
MaskEdit2.Text:= '';
MaskEdit2.Visible:= True;
MaskEdit2.SetFocus;
end;
CanSelect:= True;
end;

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case key of // Разрешаем вводить только цифры
'0'..'9' : ;
#8 : ;
#13: ;
else
key:= chr(0); // Другие символы не отображать
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
row: integer;
begin
Query1.Close; // Закрыли запрос
Query1.SQL.Clear; // Отчистили запрос
Query1.SQL.Add('Select * from ' + FileNames); // Добавили новый запрос
Query1.Open; // Открыли запрос
Query1.first; // Перешли на первую запись
row:= 0;
StringGrid1.rowcount:= Query1.recordCount; // Выставили количество строк в сетке сколько записей в запросе
while not Query1.eof do // Пока не бедет конец запроса делаем
begin
StringGrid1.cells[0,row]:= '';
StringGrid1.cells[1,row]:= Query1.FieldValues['NCHTO']; // Заносим данные в сетку
StringGrid1.cells[2,row]:= 'шт';
StringGrid1.cells[3,row]:= Query1.FieldValues['OCN'];
StringGrid1.cells[4,row]:= '';
StringGrid1.cells[5,row]:= '';
inc(row); // Увеличили на 1
Query1.next; // Перешли на новую запись запроса
end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
StringGrid1.colWidths[1]:= StringGrid1.Width - 395;
end;

procedure TForm1.MaskEdit2Exit(Sender: TObject);
begin
{Перебросим выбранное в значение из MaskEdit в grid}
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:= MaskEdit2.Text;
MaskEdit2.Visible:= False; // Спрятали MaskEdit
StringGrid1.SetFocus; // Фокус на сетку
end;

procedure TForm1.FormClose( Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree; // Освободили ресурсы занимаемые программой
end;

pr ocedure TForm1.Button3Click(Sender: TObject);
var
s: string;
begin
s:= #39 + 'OSGP.DBF' + #39; // Сделали строку с именем таблицы для запроса
Query1.Close; // Закрыли запрос
Query1.SQL.Clear; // Отчистили запрос
Query1.SQL.Add('Select * from ' + (#39 + 'OSGP.DBF' + #39)); // Добавили новый запрос
Query1.Open; // Открыли запрос
Form2.Showmodal; // Показ формы в модальном режиме
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Query1.Close; // Закрыли запрос
Form3.Showmodal; // Показ формы в модальном режиме
end;

end.

Это модуль формы «Остатки по складу готовой продукции»
Код:
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB;

type
TForm2 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
Close;
end;

end.

Это модуль формы «Оглавление карточки складского учёта склада ГП»
Код:
unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids;

type
TForm3 = class(TForm)
Button1: TButton;
Label1: TLabel;
ComboBox1: TComboBox;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Edit1: TEdit;
Label2: TLabel;
Label3: TLabel;
DBGrid1: TDBGrid;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;

implementation

uses unit1;

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
Close;
end;

procedure TForm3.FormResize(Sender: TObject);
begin
DBGrid1.Columns[1].Width:= DBGrid1.Width - 93;
end;

procedure TForm3.Edit1Ke yPress(Sender: TObject; var Key: Char);
begin
if key = #13 then // нажата клавиша enter
begin
if ComboBox1.Text = '' then
begin
ShowMessage('Выбирете сначала кладовщика');
exit;
end;
if RadioButton1.Checked then
begin
Form1.Query1.Close; // Закрыли запрос
Form1.Query1.SQL.Clear; // Отчистили запрос
Form1.Query1.SQL.Add('Select NKART, NCHTO, NKL from ' + (#39 + 'OSGP.DBF' + #39) + ' where NKART = ' + (#39 + Edit1.Text + #39) + ' and (NKL = ' + #39 + ComboBox1.Text + #39 +')'); // Добавили новый запрос
Form1.Query1.Open; // Открыли запрос
if Form1.Query1.RecordCount <> 0 then
ComboBox1.Text:= Form1.Query1.FieldValues['NKL']; // Показали в комбобоксе номер кладовщика
end
else
begin
For m1.Query1.Close; // Закрыли запрос
Form1.Query1.SQL.Clear; // Отчистили запрос
Form1.Query1.SQL.Add('Sel ect NKART, NCHTO, NKL from ' + (#39 + 'OSGP.DBF' + #39) + ' where (NCHTO LIKE "%' + AnsiUpperCase(Edit1.Text) +'%") and (NKL = ' + #39 + ComboBox1.Text + #39 +')'); // Добавили новый запрос
Form1.Query1.Open; // Открыли запрос
end;
end;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
if ComboBox1.Text = '' then // Нужен ноиер кладовщика
begin
ShowMessage('Выбирете сначала кладовщика');
exit;
end;
Form1.Query1.Close; // Закрыли запрос
Form1.Query1.SQL.Clear; // Отчистили запрос
Form1.Query1.SQL.Add('Select NKART, NCHTO from ' + (#39 + 'OSGP.DBF' + #39) + ' where NKL = ' + (#39 + ComboBox1.Items.Strings[ComboBox1.Itemindex] + #39)); // Добавили новый запрос
Form1.Query1.Open; // Открыли запрос
end;

end.

Весь проект.
-----
Помогли тебе, помоги и ты.

Ответ отправил: Евгений/Genia007/, Бакалавр
Ответ отправлен: 02.02.2010, 20:39
Номер ответа: 259160

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 259160 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.14 от 03.02.2010

    В избранное