3 / 3 / 0
Регистрация: 01.02.2019
Сообщений: 67

Переделать код под Gson

01.02.2019, 11:14. Показов 3039. Ответов 17

Студворк — интернет-сервис помощи студентам
Доброго утра. Совсем недавно изучаю java и уже дали сложное задание в университете.
Суть такая: есть json файл:
JSON
1
{"cod":"200","message":0.0034,"cnt":37,"list":[{"dt":1549011600,"main":{"temp":-1.67,"temp_min":-4.89,"temp_max":-1.67,"pressure":1029.07,"sea_level":1031.71,"grnd_level":1029.07,"humidity":97,"temp_kf":3.22},"weather":[{"id":600,"main":"Snow","description":"небольшой снегопад","icon":"13d"}],"clouds":{"all":76},"wind":{"speed":4.07,"deg":73.5071},"snow":{"3h":0.0575},"sys":{"pod":"d"},"dt_txt":"2019-02-01 09:00:00"},{"dt":1549022400,"main":{"temp":-1.65,"temp_min":-4.07,"temp_max":-1.65,"pressure":1028.68,"sea_level":1031.25,"grnd_level":1028.68,"humidity":95,"temp_kf":2.41},"weather":[{"id":600,"main":"Snow","description":"небольшой снегопад","icon":"13d"}],"clouds":{"all":76},"wind":{"speed":4.56,"deg":81.5035},"snow":{"3h":0.06875},"sys":{"pod":"d"},"dt_txt":"2019-02-01 12:00:00"},"country":"RU"}}
Есть unix дата и время "1549108800"

В дсон файле в массиве list находятся "dt", содержащие тоже дату и время , среди которых надо найти индекс той, которая ближе всего к моей. Когда я использовала джсон, код выглядел так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
JSONObject weatherDataJson = new JSONObject(weatherDataCollect(message));        
        JSONArray list1 = weatherDataJson.getJSONArray("list");
 
        long tomorrowTime = 1549108800;
        long timeDifference = Integer.MAX_VALUE;
        int minDtIndex = 0;
        // тут я сравнивала разницу между моим временем и временем в dt, индекс той dt, в которой дата и время ближе к моей
       // я присваивала minDtIndex
        for (int i = 0; i <list1.length(); i++){
            JSONObject weatherItem = list1.getJSONObject(i);
            Integer dt = Integer.valueOf(weatherItem.get("dt").toString()); //тут я получала значение из dt
            long diff = Math.abs(tomorrowTime - dt);
            if(diff < timeDifference){
                timeDifference = diff;
                minDtIndex = i;
            }
        }
        FiveDaysWeather fiveDaysWeatherObj = null;
        Gson tomorrowWeatherGson = new Gson();
        JSONObject nearestForecast = list1.getJSONObject(minDtIndex); //тут я подставляла индекс нужной dt
        fiveDaysWeatherObj = tomorrowWeatherGson.fromJson(nearestForecast.toString(), FiveDaysWeather.class);         
 
        return fiveDaysWeatherObj.weatherShow(message, "завтра");
этот код прекрасно работал. Пока преподаватель не сказала переделать, использую gson от google
Получилось так:

Java
1
2
3
4
5
6
7
8
        String jsonOutput= weatherDataCollect(message);
        System.out.println(jsonOutput);
        Gson gson = new Gson();
        JsonElement element = gson.fromJson(jsonOutput, JsonElement.class);
        JsonObject jsonObject = element.getAsJsonObject();
        JsonArray list1 = jsonObject.getAsJsonArray("list");
// после выполнение этой части получаем массив вида:
// [{"dt":1549011600,"main":{"temp":-2,"temp_min":-3.55,"temp_max":-2,"pressure":1030.01,"sea_level":1032.7,"grnd_level":1030.01,"humidity":91,"temp_kf":1.54},"weather":[{"id":600,"main":"Snow","description":"небольшой снегопад","icon":"13d"}],"clouds":{"all":44},"wind":{"speed":3.96,"deg":73.5004},"snow":{"3h":0.0515},"sys":{"pod":"d"},"dt_txt":"2019-02-01 09:00:00"},{"dt":1549022400,"main":{"temp":-2.13,"temp_min":-3.28,"temp_max":-2.13,"pressure":1029.5,"sea_level":1032.25,"grnd_level":1029.5,"humidity":93,"temp_kf":1.16},"weather":[{"id":800,"main":"Clear","description":"ясно","icon":"01d"}],"clouds":{"all":68},"wind":{"speed":4.41,"deg":78.5},"snow":{"3h":0.025},"sys":{"pod":"d"},"dt_txt":"2019-02-01 12:00:00"}]
Казалось, что всё идет по плану, пишу дальше:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
long tomorrowTime = 1549108800;
        long timeDifference = Integer.MAX_VALUE;
        int minDtIndex = 0;        
        for (int i = 0; i <list1.size(); i++){
            JsonObject weatherItem = list1.getAsJsonObject();           
            Integer dt = Integer.valueOf(weatherItem.get("dt").toString()); //get dt parameters
            long diff = Math.abs(tomorrowTime - dt);
            if(diff < timeDifference){
                timeDifference = diff;
                minDtIndex = i;
                System.out.println(minDtIndex);
            }
        }
Эта часть уже не работает, ругается на массив, что это не джсон объект "Exception in thread "main" java.lang.IllegalStateException: Not a JSON Object:"
Читала документацию по gson, пыталась найти ответы в гугле (вдруг кто сталкивался с таким). Пока нет результатов. Последняя надежда на вас.

Продолжение кода будет такое:
Java
1
2
JsonElement todaysWeather = list.get(minDtIndex);
        FiveDaysWeather fiveDaysWeather = gson.fromJson(todaysWeather.toString(), FiveDaysWeather.class);
вот этот самый поиск индекса ближайшего к моему времени dt я не смогла найти. Если поставить "0", "1", "2" всё прекрасно извлекается. Мне надо сделать, чтобы программа нужный индекс искала сама.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.02.2019, 11:14
Ответы с готовыми решениями:

возможно ли переделать код алгоритма под Borland C переделать под Borland Delphi?
Подскажите возможно ли переделать код алгоритма под Borland C переделать под Borland Delphi? У меня есть исходник алгоритма шифрования SEAL...

Переделать код под С++
Переделать код под С++ (или любой другой) function mypractice format long %------------Задание исходных...

Переделать код под c++
Есть код Pascal, нужно его переделать под c++. Но поскольку в этом не особо разбираюсь прошу у вас помощи. Заранее благодарен. Спасибо за...

17
 Аватар для worldown
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
01.02.2019, 14:44
kulichiki96,
Честно сказать довольно всё сумбурно, грязно:
Разбираться в этом, оой как не хочется..
1. Почистите код.
2. Напишите классы и методы для каждого действия
3. Пользуйтесь отладчиком
0
3 / 3 / 0
Регистрация: 01.02.2019
Сообщений: 67
01.02.2019, 15:14  [ТС]
worldown, не поняла вас. Это и есть метод. И что там чистить? 8 строчек цикла, или цикл тоже надо методом делать? Хорошо, сделаю его отдельным методом. Проблема в том, что он не работает
да и чего там разбираться? есть массив, из него пытаюсь достать значения dt: "dt":1549011600,"dt":1549022400. Их там, конечно, больше. Я для образца обрезала его.
0
 Аватар для worldown
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
01.02.2019, 15:22
kulichiki96, скиньте целый json и gson запрос сюда
0
3 / 3 / 0
Регистрация: 01.02.2019
Сообщений: 67
01.02.2019, 15:29  [ТС]
так выглядит json файл
JSON
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
{
  "cod":"200",
  "message":0.0021,
  "cnt":40,
  "list":[
    {
      "dt":1547812800,
      "main":{
        "temp":-5.72,
        "temp_min":-6.64,
        "temp_max":-5.72,
        "pressure":1005.73,
        "sea_level":1008.41,
        "grnd_level":1005.73,
        "humidity":91,
        "temp_kf":0.91
      },
      "weather":[
        {
          "id":600,
          "main":"Snow",
          "description":"небольшой снегопад",
          "icon":"13d"
        }
      ],
      "clouds":{
        "all":76
      },
      "wind":{
        "speed":4.27,
        "deg":281.504
      },
      "snow":{
        "3h":0.163
      },
      "sys":{
        "pod":"d"
      },
      "dt_txt":"2019-01-18 12:00:00"
    },
    {
      "dt":1547823600,
      "main":{
        "temp":-7.03,
        "temp_min":-7.72,
        "temp_max":-7.03,
        "pressure":1006.97,
        "sea_level":1009.62,
        "grnd_level":1006.97,
        "humidity":80,
        "temp_kf":0.69
      },
      "weather":[
        {
          "id":600,
          "main":"Snow",
          "description":"небольшой снегопад",
          "icon":"13n"
        }
      ],
      "clouds":{
        "all":68
      },
      "wind":{
        "speed":3.57,
        "deg":282.502
      },
      "snow":{
        "3h":0.039
      },
      "sys":{
        "pod":"n"
      },
      "dt_txt":"2019-01-18 15:00:00"
    },
    {
      "dt":1547834400,
      "main":{
        "temp":-8.23,
        "temp_min":-8.69,
        "temp_max":-8.23,
        "pressure":1007.91,
        "sea_level":1010.49,
        "grnd_level":1007.91,
        "humidity":86,
        "temp_kf":0.46
      },
      "weather":[
        {
          "id":800,
          "main":"Clear",
          "description":"ясно",
          "icon":"01n"
        }
      ],
      "clouds":{
        "all":64
      },
      "wind":{
        "speed":3.01,
        "deg":290.002
      },
      "snow":{
        "3h":0.017
      },
      "sys":{
        "pod":"n"
      },
      "dt_txt":"2019-01-18 18:00:00"
    },
    {
      "dt":1548234000,
      "main":{
        "temp":-9.23,
        "temp_min":-9.23,
        "temp_max":-9.23,
        "pressure":1022.7,
        "sea_level":1025.48,
        "grnd_level":1022.7,
        "humidity":81,
        "temp_kf":0
      },
      "weather":[
        {
          "id":800,
          "main":"Clear",
          "description":"ясно",
          "icon":"01d"
        }
      ],
      "clouds":{
        "all":0
      },
      "wind":{
        "speed":3.41,
        "deg":217
      },
      "snow":{
        "3h":0.0024999999999995
      },
      "sys":{
        "pod":"d"
      },
      "dt_txt":"2019-01-23 09:00:00"
    }
  ],
  "city":{
    "id":536203,
    "name":"Sankt-Peterburg",
    "coord":{
      "lat":59.9167,
      "lon":30.25
    },
    "country":"RU"
  }
}
Потом у меня есть такой метод, который его превращает в строку:

Java
1
2
3
4
5
6
String weatherData = "";
        while (in.hasNext()) {
            weatherData += in.nextLine();
        }
 
        return weatherData;
С ним я уже и работаю. Возможно, gson настолько мощный, что может прямо с сайта получить json файл в том виде, в котором он есть без необходимости его превращать в строку. Я смогла сделать так.

В итоге, чтобы вытаскивать нужные данные мне надо получить вот такого вида данные:

JSON
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
31
32
33
34
35
{
      "dt":1547812800,
      "main":{
        "temp":-5.72,
        "temp_min":-6.64,
        "temp_max":-5.72,
        "pressure":1005.73,
        "sea_level":1008.41,
        "grnd_level":1005.73,
        "humidity":91,
        "temp_kf":0.91
      },
      "weather":[
        {
          "id":600,
          "main":"Snow",
          "description":"небольшой снегопад",
          "icon":"13d"
        }
      ],
      "clouds":{
        "all":76
      },
      "wind":{
        "speed":4.27,
        "deg":281.504
      },
      "snow":{
        "3h":0.163
      },
      "sys":{
        "pod":"d"
      },
      "dt_txt":"2019-01-18 12:00:00"
    }
Для этого у меня уже подготовлены классы и методы get/set
0
 Аватар для worldown
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
01.02.2019, 15:31
Цитата Сообщение от kulichiki96 Посмотреть сообщение
И что там чистить? 8 строчек цикла, или цикл тоже надо методом делать?
Всё нужно инкапсулировать, полиморфить, абстрагировать, наследовать. java это ООП всё должно быть по полочкам и джавадоками, что бы не гадать на кофейной гуще потом.
1)Получаем JSON или GSON делаем удобноюзабилитную коллекцию
2)Проходимся по коллекции сравнивая текущую дату с датой коллекции
3)Выводим нужный результат
0
3 / 3 / 0
Регистрация: 01.02.2019
Сообщений: 67
01.02.2019, 15:42  [ТС]
worldown, у меня загвоздка только в цикле не получается вытащить из массива нужные данные
библиотека JSON это делала так
Java
1
Integer.valueOf(weatherItem.get("dt").toString());
и всё, значение (т.е. дата/время в юникс виде) у меня есть, даль я сравниваю с "long tomorrowTime = 1549108800;" и записываю индекс этой даты как minDtIndex. Беру следующую и по новой, если она ещё ближе к "tomorrowTime", то индекс
этой даты снова записываю и т.д. В конце я получаю индекс dt в массиве, чье значение наиболее близко к tomorrowTime.

Java
1
2
3
4
long diff = Math.abs(tomorrowTime - dt);
            if(diff < timeDifference){
                timeDifference = diff;
                minDtIndex = i;
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
01.02.2019, 16:28
Цитата Сообщение от kulichiki96 Посмотреть сообщение
Эта часть уже не работает, ругается на массив, что это не джсон объект
Правильно ругается. У тебя list1 — это массив:
Цитата Сообщение от kulichiki96 Посмотреть сообщение
Java
1
JsonArray list1 = jsonObject.getAsJsonArray("list");
А ты пытаешься его к объекту преобразовать:
Цитата Сообщение от kulichiki96 Посмотреть сообщение
Java
1
JsonObject weatherItem = list1.getAsJsonObject();
0
 Аватар для worldown
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
01.02.2019, 18:09
kulichiki96,
Java
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
31
32
33
package json;
 
 
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonReader;
 
import java.io.FileReader;
import java.util.List;
 
public class Converter {
 
 
    public static void main(String[] args) throws Exception {
        GsonBuilder builder = new GsonBuilder();
        Gson gson = builder.create();
        JsonReader reader = new JsonReader(new FileReader("C:\\projects\\mytest\\data\\message.json"));
        Data data = gson.fromJson(reader, Data.class);
        //тут у нас находится список всез dt
        System.out.print(data.list.get(0).dt);
 
    }
 
}
 
class Data {
    public String cod;
    public List<Weather> list;
}
 
class Weather {
    public String dt;
}
0
3 / 3 / 0
Регистрация: 01.02.2019
Сообщений: 67
02.02.2019, 13:06  [ТС]
worldown, спасибо) буду в понедельник разбираться
0
3 / 3 / 0
Регистрация: 01.02.2019
Сообщений: 67
04.02.2019, 14:34  [ТС]
worldown,
Всё переделала

Java
1
2
3
4
5
6
String jsonOutput= weatherDataCollect(message);
        Gson gson = new Gson();
        JsonElement element = gson.fromJson(jsonOutput, JsonElement.class);
        JsonObject jsonObject = element.getAsJsonObject();
        System.out.println(jsonObject.toString());
        JsonArray list = jsonObject.getAsJsonArray("list");
если введём команду
Java
1
JsonElement todaysWeather = list.get(0);
получим

JSON
1
{"dt":1549281600,"main":{"temp":-0.38,"temp_min":-1.3,"temp_max":-0.38,"pressure":1024.85,"sea_level":1027.5,"grnd_level":1024.85,"humidity":94,"temp_kf":0.91},"weather":[{"id":600,"main":"Snow","description":"небольшой снегопад","icon":"13d"}],"clouds":{"all":92},"wind":{"speed":2.11,"deg":271.5},"snow":{"3h":0.5445},"sys":{"pod":"d"},"dt_txt":"2019-02-04 12:00:00"}
То, что надо. у меня есть теперь "dt" и её значение 1549281600
Но это одна dt, а мне надо пройти по всем индексам массива

Начала писать и опять проблема
Java
1
2
3
4
5
for (int i = 0; i < list.size(); i++){
            JsonElement weatherItem = list.get(i); // получаем кусочек массива с dt
            Integer dt = Integer.valueOf(weatherItem.getAsString("dt").toString()); //а вот тут надо вытащить значение 
                                                                                                                     //переменной dt
        }
Как бы мне вытащить это самое значение? при использовании JSON срабатывал такой способ
Java
1
Integer dt = Integer.valueOf(weatherItem.get("dt").toString())
В gson он не работает
0
 Аватар для worldown
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
04.02.2019, 15:13
Лучший ответ Сообщение было отмечено kulichiki96 как решение

Решение

kulichiki96,

Java
1
2
3
       for(int i = 0; i < list.size(); i++) {
           list.get(i).getAsJsonObject().get("dt").getAsInt();
        }
0
3 / 3 / 0
Регистрация: 01.02.2019
Сообщений: 67
04.02.2019, 15:49  [ТС]
worldown,
Java
1
2
3
4
5
6
7
8
9
for (int i = 0; i < list.size(); i++){
            JsonElement weatherItem = list.get(i);
            Integer dt = new Integer(weatherItem.getAsJsonObject().get("dt").getAsInt());
            long diff = Math.abs(tomorrowTime - dt);
                if(diff < timeDifference){
                    timeDifference = diff;
                    minDtIndex = i;
                }
        }
Так нормально будет?
0
 Аватар для worldown
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
04.02.2019, 15:53
Лучший ответ Сообщение было отмечено kulichiki96 как решение

Решение

kulichiki96,
Java
1
2
3
4
5
6
7
8
for (int i = 0; i < list.size(); i++) {
    int dt = list.get(i).weatherItem.getAsJsonObject().get("dt").getAsInt();
    int diff = Math.abs(tomorrowTime - dt);
        if(diff < timeDifference){
            timeDifference = diff;
            minDtIndex = i;
        }
}
вот так лучше наверно..
да, смысл long использовать нет. лучше int

искомое dt должно быть 1548234000

Не по теме:

А что за универ что json задают делать?

1
3 / 3 / 0
Регистрация: 01.02.2019
Сообщений: 67
04.02.2019, 15:58  [ТС]
Цитата Сообщение от worldown Посмотреть сообщение
А что за универ что json задают делать?
ИТМО
Преподаватель псих, помешанный на джаве
А пятерку хочется, сейчас ещё разбираться, как локацию передать телеграммовскому боту
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
04.02.2019, 16:37
Цитата Сообщение от kulichiki96 Посмотреть сообщение
ИТМО
Вроде хороший вуз. Зачем ты туда поступила, если не можешь справиться с таким простым заданием?

Цитата Сообщение от kulichiki96 Посмотреть сообщение
Преподаватель псих
С чего б вдруг?

Цитата Сообщение от kulichiki96 Посмотреть сообщение
А пятерку хочется
Так может, нужно знания до пятёрки дотянуть?
0
3 / 3 / 0
Регистрация: 01.02.2019
Сообщений: 67
04.02.2019, 16:40  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Зачем ты туда поступила, если не можешь справиться с таким простым заданием?
то, что для одних просто, для других сложно. А Джава у нас только месяц, я ещё не успела разобраться. Мне си шарп легче показался
0
 Аватар для worldown
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
04.02.2019, 16:45
kulichiki96,
да не. нормально решаешь..
Сумбур конечно, много лишней лепнины, но это с опытом улучшится.
Си шарп почти такой же.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2019, 16:45
Помогаю со студенческими работами здесь

Переделать код под С++
Всем привет! Помогите пожалуйста переделать код. Имеется программа для Матлаб, но надо переписать ее на язык С++ (RAD Studio 10.1...

Переделать код программы под Си
помогите переделать код программы под Си #include &lt;iostream&gt; using namespace std; int main() { int N, a, b, c; ...

Переделать код под стандарт C++98
с++ переделать код под стандарт с++98 #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;tuple&gt; #include &lt;cmath&gt; typedef...

Необходимо переделать код под Qt
Только начал изучать всё это дело и пока не особо понимаю, как переделать данный код под Qt. Сама задача звучит так: Входные...

Как переделать под 8.1 код
Как можно переделать этот код с приложения 8.0 Silverlight пишу под WP 8.1? Прочитать файл созданный и заполоненный который в проекте,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru